ASP.NET 身份数据库第一个自定义用户和角色

ASP.NET Identity Database First custom user and role

我们正在尝试使用 OWIN 和 .Net Identity 实现 Web API 项目以进行身份​​验证。我们有针对用户和角色的自定义数据库表,因此我们需要为 EF 采用数据库优先方法。

我已经设法让 Identity 与我们的自定义帐户表一起工作(感谢其他 Whosebug 线程),但我仍然坚持让角色工作......

总而言之,我到目前为止所做的是实现了一个具有以下功能的自定义 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);
    }

    ....
}

** 请注意,Account 实体没有继承 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 框架一起工作吗?

谢谢!

上面代码的问题在于您添加了一个声明类型未知(至少对于系统而言)的角色。对于角色,预定义的 claim-type 是 http://schemas.microsoft.com/ws/2008/06/identity/claims/roleSystem.Security.Claims.ClaimTypes.Role。所以请将您的代码更改为

identity.AddClaim(new Claim("sub", context.UserName));
identity.AddClaim(new Claim(ClaimTypes.Role, "user"));