如何在登录过程中添加自定义数据来声明



我正在阅读这里的文章

这样我们可以在登录时添加声明

var user = userManager.Find(userName, password);
identity.AddClaim(new Claim(ClaimTypes.Email, user.Email));
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = persistCookie }, identity);

这样就可以读回存储在clam

中的值
var prinicpal = (ClaimsPrincipal)Thread.CurrentPrincipal;
var email = prinicpal.Claims.Where(c => c.Type == ClaimTypes.Email).Select(c => c.Value).SingleOrDefault();

现在我有几个问题

  1. 我如何添加我的自定义数据索赔。假设用户角色名。假设我想添加的东西在ClaimTypes中不可用,那么我如何添加自定义数据来声明?

  2. 如何读取存储在索赔中的自定义数据?

  3. 我的动作用authorized属性装饰,其中角色名指定如下:

.

 public class HomeController : Controller
 {
     [Authorize(Roles = "Admin, HrAdmin")]
     public ActionResult PayRoll()
     {
         return View();
     }
  }

我是否需要使用自定义身份验证来从声明中提取角色以在GenericPrincipal中设置?

最后一个问题:当我们使用基于角色的授权时,角色存储在授权cookie中?我是否需要编写代码来将角色存储在授权cookie或ASP.net引擎中?

同样的方式声明存储在授权cookie生成的自己的cookie?

如果你正在使用Identity,那么Identity有它自己的方法可以处理角色和所有你只需要登录这一行。

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);

您必须在身份配置文件

中添加角色管理器
public class ApplicationRoleManager : RoleManager<IdentityRole>
    {
        public ApplicationRoleManager(IRoleStore<IdentityRole, string> roleStore)
        : base(roleStore)
        { }
        public static ApplicationRoleManager Create(
            IdentityFactoryOptions<ApplicationRoleManager> options,
            IOwinContext context)
        {
            var manager = new ApplicationRoleManager(
                new RoleStore<IdentityRole>(context.Get<ApplicationDbContext>()));
            return manager;
        }
    }

并在Startup.Auth.cs

中注册
    app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

,您将不必手动为身份验证提供角色。你只需要写

[Authorize(Roles = "Admin, HrAdmin")]

如果你想手动添加没有标识的方法,使用下面的

private void IdentityLogin(UserInfo UserInfo)
        {
            // Waleed: added the role in the claim
            var identity = new ClaimsIdentity(new[] {
                                    new Claim(ClaimTypes.Name, UserInfo.Email),
                                    new Claim(ClaimTypes.Sid, UserInfo.UserID),
                                    new Claim(ClaimTypes.Role, UserInfo.Roles)
                                }, DefaultAuthenticationTypes.ApplicationCookie);
            var claimsPrincipal = new ClaimsPrincipal(identity);
            // Set current principal
            Thread.CurrentPrincipal = claimsPrincipal;
            var ctx = Request.GetOwinContext();
            var authManager = ctx.Authentication;
            authManager.SignIn(identity);
        }

声明有两种类型,一种在会话中,另一种存储在db中。会话声明在IdentityLogin方法中,db声明可以写成

    UserManager.AddClaim(userId,new Claim())

相关内容

  • 没有找到相关文章

最新更新