gpt4 book ai didi

c# - 授权角色 WebAPI oauth owin

转载 作者:IT王子 更新时间:2023-10-29 04:29:29 24 4
gpt4 key购买 nike

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

这是一段代码:

[Authorize(Roles = "admins")]
public IEnumerable<CompanyModel> Get()
{
ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal;
bool isrole = principal.IsInRole("admins");

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

最佳答案

您必须在 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);

已编辑

您可以从数据库中获取用户角色,而不是使用“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);
}

关于c# - 授权角色 WebAPI oauth owin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25661623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com