加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 在成功登录时添加声明并在应用程序的其他位置检索它

发布时间:2020-12-16 00:17:12 所属栏目:asp.Net 来源:网络整理
导读:请求我帮助实现向经过身份验证的用户分配声明的自定义方式. 成功登录后, var result = await SignInManager.PasswordSignInAsync(model.Email,model.Password,model.RememberMe,shouldLockout: false); switch (result) { case SignInStatus.Success: //Get
请求我帮助实现向经过身份验证的用户分配声明的自定义方式.
成功登录后,
var result = await SignInManager.PasswordSignInAsync(model.Email,model.Password,model.RememberMe,shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                //Get the user
                ApplicationUser user = UserManager.FindByEmail(model.Email);
                //Ends here
                ClaimsIdentity identity = await UserManager.CreateIdentityAsync(user,DefaultAuthenticationTypes.ApplicationCookie);
                AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = true },identity);

我使用userId从数据存储区中获取有关用户的角色和其他信息.此后,我需要在重定向到用户仪表板之前,使用电子邮件,角色,名字,姓氏,性别等信息添加有关用户的声明.
这是我尝试这样做的方式,但问题是即使在登录方法添加声明后,我也无法在_loginPartial剃刀视图中检索它

例如,当我想在登录部分显示电子邮件索赔值时,就像这样

var claims = ClaimsPrincipal.Current.Claims;
    var principal = (ClaimsPrincipal)Thread.CurrentPrincipal;
    var email = principal.Claims.Where(c => c.Type == ClaimTypes.Email).Select(c => c.Value).SingleOrDefault();

它返回null.

因此,我只能在添加它们后使用相同的登录方法访问它们,但我需要能够从应用程序的任何位置访问它.
如果能够在整个申请中的任何其他地方检索这些声明,我将非常感谢.

谢谢.

解决方法

您必须在登录前添加您的声明,而不是之后.考虑这个例子:
public async Task<ActionResult> Login(LoginViewModel model,string returnUrl)
{
    var user = UserManager.Find(model.Email,model.Password);
    if(user!=null)
    {
        var ident = UserManager.CreateIdentity(user,DefaultAuthenticationTypes.ApplicationCookie);
        ident.AddClaims(new[] {
            new Claim("MyClaimName","MyClaimValue"),new Claim("YetAnotherClaim","YetAnotherValue"),});
        AuthenticationManager.SignIn(
            new AuthenticationProperties() { IsPersistent = true },ident);
        return RedirectToLocal(returnUrl);
    }
    ModelState.AddModelError("","Invalid login attempt.");
    return View(model);
}

现在,由于我们在登录时注入了索赔,因此我们可以随时随地访问索赔:

((ClaimsIdentity)User.Identity).FindFirst("MyClaimName");

您还可以在ApplicationUser.GenerateUserIdentityAsync()方法中添加声明.通过在此方法中添加声明,您可以使用SignInManager.PasswordSignInAsync()方法登录用户,而无需修改默认的Login操作方法.

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this,DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        userIdentity .AddClaims(new[] {
            new Claim("MyClaimName",});
        return userIdentity;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读