gpt4 book ai didi

asp.net-mvc-5 - MVC 身份 2 使用 FormsAuthenticationTicket

转载 作者:行者123 更新时间:2023-12-02 06:57:40 24 4
gpt4 key购买 nike

我正在用自定义版本替换 (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 。我已经注销并重新登录。 enter image description here

最佳答案

有些声明的目的完全相同。只有新的 API 实际上是这样设计的。

claim 基本上是一个Dictionary<String, String>存储在 auth-cookie 中,可通过 IPrincipal 访问.但是你不需要做 ICustomPrincipal因为你落后的实际对象 IPrincipalClaimsPrincipal并且有一份 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.CurrentPrincipalClaimsPrincipal.Current在 MVC 应用程序中 - 您并不总能得到预期的结果,尤其是当用户未登录或处于 AppPool 启动的早期阶段时。

关于asp.net-mvc-5 - MVC 身份 2 使用 FormsAuthenticationTicket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28137034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com