我正在阅读这里的文章
这样我们可以在登录时添加声明
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();
现在我有几个问题
我如何添加我的自定义数据索赔。假设用户角色名。假设我想添加的东西在
ClaimTypes
中不可用,那么我如何添加自定义数据来声明?如何读取存储在索赔中的自定义数据?
我的动作用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())