- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用自定义版本替换 (HttpContext.Current.User) IPrincipal,这样我就可以存储更多信息登录和用户。我在使用 FormsAuthtenticationTicket 之前已经这样做了,但是那些其他方法是基于 Memberhipship 和 SimpleMembership 提供者。
我的问题是,我可以使用 FormsAuthenticationTicket 来存储我的 ICustomPrincipal 的 cookie,因为它会干扰或破坏 OWIN 身份管道吗?我觉得我会混合苹果和橙子。
示例保存:
var user = userRepository.Users.Where(u => u.Email == viewModel.Email).First();
CustomPrincipalSerializeModel serializeModel = new CustomPrincipalSerializeModel();
serializeModel.UserId = user.Id;
serializeModel.FirstName = user.FirstName;
serializeModel.LastName = user.LastName;
JavaScriptSerializer serializer = new JavaScriptSerializer();
string userData = serializer.Serialize(serializeModel);
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1,
viewModel.Email,
DateTime.Now,
DateTime.Now.AddMinutes(15),
false,
userData);
string encTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
Response.Cookies.Add(faCookie);
示例检索:
protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
{
HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
JavaScriptSerializer serializer = new JavaScriptSerializer();
CustomPrincipalSerializeModel serializeModel = serializer.Deserialize<CustomPrincipalSerializeModel>(authTicket.UserData);
CustomPrincipal newUser = new CustomPrincipal(authTicket.Name);
newUser.UserId = serializeModel.UserId;
newUser.FirstName = serializeModel.FirstName;
newUser.LastName = serializeModel.LastName;
HttpContext.Current.User = newUser;
}
}
编辑我有这个用于创建声明
public ClaimsIdentity CreateIdentity(
LoginAttempt loginAttempt)
{
UserProfile userProfile = GetUserProfile(loginAttempt.UserName);
var applicationUser = FindById(userProfile.AspNetUserId);
ClaimsIdentity identity;
try
{
identity = UserManager.CreateIdentity(applicationUser, DefaultAuthenticationTypes.ApplicationCookie);
}
catch (Exception ex)
{
_log.Error(ex.Message, ex);
return null;
}
//UserManager.GetClaims()
identity.AddClaim(new Claim("LoginAttemptId", loginAttempt.LoginAttemptId.ToString(),ClaimValueTypes.String));
identity.AddClaim(new Claim("UserProfileId", loginAttempt.UserProfileId.ToString(), ClaimValueTypes.String));
identity.AddClaim(new Claim("SubscriptionType", userProfile.SubscriptionType, ClaimValueTypes.String));
IList<string> roles= UserManager.GetRoles(applicationUser.Id);
identity.AddClaim(new Claim(ClaimTypes.Role, roles.First()));
return identity;
}
这个用于提取
public static long GetLoginAttemptId(this IIdentity principal)
{
var claimsPrincipal = principal as ClaimsIdentity;
if (claimsPrincipal == null)
{
//throw new Exception("User is not logged in!");
return -1;
}
var nameClaim = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == "LoginAttemptId");
if (nameClaim != null)
{
return Convert.ToInt64( nameClaim.Value);// as long;
}
return -1;
}
编辑这些是我得到的 claim 。我已经注销并重新登录。
最佳答案
有些声明的目的完全相同。只有新的 API 实际上是这样设计的。
claim 基本上是一个Dictionary<String, String>
存储在 auth-cookie 中,可通过 IPrincipal
访问.但是你不需要做 ICustomPrincipal
因为你落后的实际对象 IPrincipal
是ClaimsPrincipal
并且有一份 claim list 。
您需要在登录前向 Idnentity 对象添加额外信息:
public async override Task CreateIdentityAsync(ApplicationUser applicationUser)
{
var identity = await base.CreateIdentityAsync(applicationUser, DefaultAuthenticationTypes.ApplicationCookie);
identity.AddClaim(new Claim("MyApp:FullName", applicationUser.FullName));
return identity;
}
然后您就可以通过扩展从 IPrincipal 中获取这些数据:
public static String GetFullName(this IPrincipal principal)
{
var claimsPrincipal = principal as ClaimsPrincipal;
if (claimsPrincipal == null)
{
throw new Exception("User is not logged in!");
}
var nameClaim = principal.Claims.FirstOrDefault(c => c.Type == "MyApp:FullName");
if (nameClaim != null)
{
return nameClaim.Value;
}
return String.Empty;
}
我已经在几个项目中成功地使用了这种方法。参见 other similar answers获取更多代码示例。
这是 another article , 尽管我不鼓励使用 Thread.CurrentPrincipal
或 ClaimsPrincipal.Current
在 MVC 应用程序中 - 您并不总能得到预期的结果,尤其是当用户未登录或处于 AppPool 启动的早期阶段时。
关于asp.net-mvc-5 - MVC 身份 2 使用 FormsAuthenticationTicket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28137034/
我正在寻找一种解决方案,我们可以在其中制作具有很长有效期的 FormsAuthenticationTicket(和相应的 cookie)。这可以通过设置高值或使用滑动过期来实现,但是当网站的应用程序池
我一直在网上搜索并找到了许多奇怪的答案,而且我几乎尝试了所有这些答案。我的问题是这样的。我的登录页面包含: FormsAuthenticationTicket ticket = new FormsAu
这是我在登录成功时调用的函数。 (我对这个 FormAuthentication 很陌生) public static void CreateLoginCookie(User u) { Forms
我正在尝试重新创建我的 cookie,通常由 FormsAuthentication.SetAuthCookie() 生成的 cookie 以及 webconfig 中的内容。
在我的登录页面上,FormsAuthenticationTicket 被设置为带有一些自定义用户数据的持久性 cookie。现在我需要更改此自定义用户数据,因此它包含一个多参数。当以前登录的用户下次访
我正在根据本教程使用表单例份验证为 ASP.Net 4.0 站点实现自定义标识类: Forms Authentication Configuration and Advanced Topics 我想在
我正在努力了解 FormsAuthenticationTicket 类中的 isPersistent 属性的用途。 http://msdn.microsoft.com/en-us/library/ky
我在使用 FormsAuthenticationTicket 创建非持久性 cookie 时遇到问题。我想在票证中存储用户数据,所以我不能使用 FormsAuthentication.SetAuthC
我正在使用 FormsAuthenticationTicket并放置数据并在所有页面之间传递数据。 如果我们不更改任何数据,它将起作用。 所以,现在如果我想更改数据并将其传递给 cookie 并加密,
我正在尝试创建自己的依赖于 FormsAuthentication 的身份验证机制。我基本上使用 OAuth 来允许用户在授权服务器中进行身份验证,一旦他们通过身份验证,我需要使用 FormsAuth
我正在尝试检查用户当前 FormsAuthenticationTicket 的 Expired 属性,以查看身份验证期限是否已过期。但是,当期限到期时,我永远无法获得足够的信息来创建票证以进行检查。我
通常我使用用户的电子邮件地址(唯一),但在我当前的项目中,从 User.Identity.Name 中获取用户全名(非唯一)会更有利。 那么我为身份验证 cookie 名称设置的内容真的很重要吗? 请
当我在应用程序中创建身份验证机制时,我偶然发现了 FormsAuthenticationTicket.Version属性(property)。这些文档没有举例说明任何用例,我也没有发现它在其他地方使用
我已经使用自定义数据存储实现了我自己的自定义 MembershipProvider。到目前为止没有问题。我希望人们使用他们的电子邮件而不是用户名登录。因为我有自己的数据存储,所以这不是主要问题,我可以
我正在写一个 MVC 4 带有 的 Web 应用程序自定义认证授权 .当用户登录该站点时,我创建了一个 FormsAuthenticationTicket 并将其存储在 中 cookies publi
我正在考虑在我的 View 中使用它(Razor 语法)来获取我网站的用户名: @MySite.Helpers.Utils.UserName 这是 utils 类: public class Util
我有一个使用表单成员身份验证的 ASP.NET Web 应用程序。我们最近进行了渗透测试,标记的一个问题是窃取用户帐户的能力。如果 .ASPXAUTH cookie 值是在注销之前从用户复制的,用户可
在下面的方法中,我正在解密一个 cookie 以返回它,其中包含一个用户名。我尝试为它编写一个测试用例,但返回的 cookie 为空,因为它没有登录。谁能帮我写一个测试用例吗? public stri
我使用 FormsAuthenticationTicket 加密密码并将其存储到 session 值,当我检索它时我无法解密密码。 像下面这样加密 string pw="xyz"; F
我在 Logon 方法中设置 FormsAuthenticationTicket 以手动创建身份验证 cookie。如何验证该身份验证 cookie 并将其分配给 Current.User 对象。它是
我是一名优秀的程序员,十分优秀!