我正在使用带有身份2.1.0和VS2013 U4的ASP.NET MVC 5项目。我想在注册期间向用户添加声明,以便存储在db中。这些声明代表用户自定义属性
当我为管理员创建一个用于创建/编辑/删除用户的网页时,我仍然使用AccountController
中的创建方法来创建用户,但我不想登录该用户。如何将这些声明添加到用户?
答案 0 :(得分:12)
您可能已经有UserManager
课程。您可以使用该用户创建用户并添加声明。
作为控制器中的一个例子:
// gather some context stuff
var context = this.Request.GetContext();
// gather the user manager
var usermanager = context.Get<ApplicationUserManager>();
// add a country claim (given you have the userId)
usermanager.AddClaim("userid", new Claim(ClaimTypes.Country, "Germany"));
为了实现这一点,您需要实现自己的UserManager
并将其与OWIN上下文相关联(在示例中为ApplicationUserManager
,基本上为class ApplicationUserManager : UserManager<ApplicationUser> { }
且只有少量配置添加)。这里有一些阅读:https://msdn.microsoft.com/en-us/library/dn613290%28v=vs.108%29.aspx
答案 1 :(得分:6)
你可以使用Like
private void SignInAsync(User User)
{
var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, User.Employee.Name));
claims.Add(new Claim(ClaimTypes.Email, User.Employee.EmailId));
claims.Add(new Claim(ClaimTypes.Role, User.RoleId.ToString()));
var id = new ClaimsIdentity(claims,
DefaultAuthenticationTypes.ApplicationCookie);
var claimsPrincipal = new ClaimsPrincipal(id);
// Set current principal
Thread.CurrentPrincipal = claimsPrincipal;
var ctx = Request.GetOwinContext();
var authenticationManager = ctx.Authentication;
authenticationManager.SignIn(id);
}
登录后传递此函数中的User表值
SignInAsync(result);
你可以得到像
这样的蛤蜊价值var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
// Get the claims values
string UserRoleValue = identity.Claims.Where(c => c.Type == ClaimTypes.Role)
.Select(c => c.Value).SingleOrDefault();
答案 2 :(得分:0)
事实上,您可以在创建用户帐户的同时创建声明。
在用户管理器上调用CreateAsync之前,只需将声明添加到用户对象。
var identityUser = new IdentityUser
{
UserName = username,
Email = email,
// etc...
Claims = { new IdentityUserClaim { ClaimType = "SomeClaimType", ClaimValue = "SomeClaimValue"} }
};
var identityResult = await _userManager.CreateAsync(identityUser, password);
这将创建用户并将声明与用户关联为具有持久性的一个逻辑操作。