授权角色 WebAPI oauth owin

Posted

技术标签:

【中文标题】授权角色 WebAPI oauth owin【英文标题】:Authorization roles WebAPI oauth owin 【发布时间】:2014-10-28 23:24:45 【问题描述】:

我使用 OWIN 中间件在 ASP.NET Web API 上实现了令牌授权系统。我可以成功地通过 REST 客户端进行身份验证并获得一个授权令牌来调用 API。如果我将 [Authorize] 属性放在控制器中的 GET 操作上,它也可以正常工作。如果我没有有效的令牌,它会使用 401 消息拒绝资源,但如果我使用 [Authorize(Roles="admins")]roles 参数,它不会识别用户的角色。我验证了数据库中的内容并检查了usersinroles 是否正确填写。

这是一个代码sn-p:

[Authorize(Roles = "admins")]
public IEnumerable<CompanyModel> Get()

    ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal;
    bool isrole = principal.IsInRole("admins");

我还检查了没有roles 参数的操作,isrole 布尔值始终为false。我必须启用某些东西吗?

【问题讨论】:

【参考方案1】:

必须在 GrantResourceOwnerCredentials 方法中添加:

identity.AddClaim(new Claim(ClaimTypes.Role, "admins"));

一步一步

在 StartUp.cs 类中,您应该有一个自定义提供程序,如行

Provider = new CustomAuthorizationServerProvider()

例如:

public void ConfigureOAuth(IAppBuilder app)

    OAuthAuthorizationServerOptions oAuthServerOptions = new OAuthAuthorizationServerOptions
    
        AllowInsecureHttp = true,
        TokenEndpointPath = new PathString("/token"),
        AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
        Provider = new CustomAuthorizationServerProvider()
    ;

    // Token Generation
    app.UseOAuthAuthorizationServer(oAuthServerOptions);
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

然后,继承自 OAuthAuthorizationServerProvider 类的 CustomAuthorizationServerProvider 将覆盖 GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)

然后,在检查用户的用户名和密码是否正确后,您必须添加

var identity = new ClaimsIdentity(context.Options.AuthenticationType);
...
// other claims
...
identity.AddClaim(new Claim(ClaimTypes.Role, "admins"));
...
var ticket = new AuthenticationTicket(identity, properties);
context.Validated(ticket);

已编辑

您可以从 DB 获取用户角色,而不是使用“admins”硬编码字符串:

var roles = await userManager.GetRolesAsync(userId);

因此您可以在您的存储库中添加以下方法:

public async Task<IList<string>> UserRoles(string userId)

    IList<string> roles = await userManager.GetRolesAsync(userId);

    return roles;

然后从您覆盖的 GrantResourceOwnerCredentials 中调用它,并添加:

using (AuthRepository repository = new AuthRepository())

    IdentityUser user = await repository.FindUser(context.UserName, context.Password);

    if (user == null)
    
        context.SetError("invalid_grant", "The user name or password is incorrect");
        return;
    

    var roles = repository.UserRoles(user.Id);

【讨论】:

非常感谢,它几乎可以工作,但我如何才能从用户注册角色而不是“管理员”固定字符串中获取声明? @user2100125 我已经编辑了答案以从 Db 中检索用户角色。 这对我有帮助。谢谢:) [OverrideAuthorization] 在您想要在操作级别指定不同角色与您在控制器级别定义的角色之间非常方便。好帖子here

以上是关于授权角色 WebAPI oauth owin的主要内容,如果未能解决你的问题,请参考以下文章

在 Web API/OWIN 中使用大量声明的最佳实践

在WebApi中基于Owin OAuth使用授权发放Token

如何从 OAuth 客户端凭据开始使用 OWIN Oauth 保护 WebApi?

OAuth 访问令牌是不是包含 JWT 令牌之类的角色

Owin OAuth 2.0密码授权流程

“错误:” “Unsupported_grant_type” 使用 OAuth 2.0,Owin。密码授予和授权授予