我们正在尝试使用OWIN和.Net Identity实施Web API项目以进行身份验证。我们有针对用户和角色的自定义数据库表,因此我们需要采用数据库优先的方法进行EF。
我已经设法使身份与我们的自定义帐户表一起使用(由于其他stackoverflow线程),但是我一直坚持让角色起作用...
总之,到目前为止,我已经完成了使用以下功能实现的自定义IUserStore
public class IdentityUserStore<TUser> :
IUserStore<TUser>, where TUser : IdentityUser
{
....
public Task<TUser> FindByNameAsync(string userName)
{
//throw new NotImplementedException();
IdentityUser user = null;
Account result = _accountRepo.GetByEmail(userName);
if (result != null)
{
user = new IdentityUser()
{
Id = result.Code,
UserName = result.Email,
SecurityStamp = result.SecurityStamp,
PasswordHash = result.PasswordHash,
};
}
return Task.FromResult<TUser>(user as TUser);
}
....
}
**请注意,帐户实体没有继承IUser,因此我必须手动映射IdentityUser所需的最少数据。
然后如下重写GrantResourceOwnerCredentials函数
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
UserManager<IdentityUser> _userManager = new UserManager<IdentityUser>(new IdentityUserStore<IdentityUser>());
IdentityUser user = await _userManager.FindAsync(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim("sub", context.UserName));
identity.AddClaim(new Claim("role", "user"));
context.Validated(identity);
}
通过上面的操作,[Authorize]属性有效,但是由于角色信息不可用,所以我们无法获得[Authorize(Roles =“ XXX”)]。
谁能帮助我指出从自定义数据库表中检索用户角色的正确方向,以便它与.Net Identity框架一起使用?
谢谢!
上面的代码的问题在于,您添加了一个角色类型(至少对于系统而言)未知的角色。对于角色,预定义的声明类型为http://schemas.microsoft.com/ws/2008/06/identity/claims/role
或System.Security.Claims.ClaimTypes.Role
。因此,请将您的代码更改为
identity.AddClaim(new Claim("sub", context.UserName));
identity.AddClaim(new Claim(ClaimTypes.Role, "user"));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句