gpt4 book ai didi

c# - 具有 jwt token 和身份的 asp core 2 中基于角色的授权

转载 作者:太空宇宙 更新时间:2023-11-03 14:59:23 24 4
gpt4 key购买 nike

我已经在 asp core 2 中使用 jwt token 和 asp core identity 尝试了一些授权示例。我已遵循此代码 https://github.com/SunilAnthony/SimpleSecureAPI它工作正常。

问题是基于角色的授权。我试过这样的事情: http://www.jerriepelser.com/blog/using-roles-with-the-jwt-middleware/

结果很奇怪。我的 Controller 方法:

[HttpGet]
[Authorize]
public IActionResult Get()
{
IEnumerable<Claim> claims = User.Claims; // contains claim with Type = "http://schemas.microsoft.com/ws/2008/06/identity/claims/role" and Value = "Administrator"
bool role = User.IsInRole("Administrator"); // true
bool claim = User.HasClaim(ClaimTypes.Role, "Administrator"); // true

return Ok(claims);
}

当我仅使用属性 [Authorize] 调用此端点并检查当前用户的代码中的角色/声明时,这似乎很好(两项检查均为真),但是当我将授权属性更改为[Authorize(Roles = "Administrator")] 它不起作用 -> 当我使用此属性调用此端点时,我将收到 404。我不知道问题出在哪里。我的启动类与上面的 git 链接完全相同,我刚刚在“角色”数组中的 access_token 的有效负载中添加了字符串角色名称列表:

它是硬编码的,但我已经改变了我的登录方法只是为了这样的测试:

[HttpPost("login")]
public async Task<IActionResult> SignIn([FromBody] Credentials Credentials)
{
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(Credentials.Email, Credentials.Password, false, false);
if (result.Succeeded)
{
IdentityUser user = await _userManager.FindByEmailAsync(Credentials.Email);

List<string> roles = new List<string>();
roles.Add("Administrator");

return new JsonResult(new Dictionary<string, object>
{
{ "access_token", GetAccessToken(Credentials.Email, roles) },
{ "username", user.Email },
{ "expired_on", DateTime.UtcNow.AddMinutes(_tokenLength) },
{ "id_token", GetIdToken(user) }
});
}
return new JsonResult("Unable to sign in") { StatusCode = 401 };
}
return new JsonResult("Unable to sign in") { StatusCode = 401 };
}

GetAccessTokenMethod:

private string GetAccessToken(string Email, List<string> roles)
{
var payload = new Dictionary<string, object>
{
{ "sub", Email },
{ "email", Email },
{ "roles", roles },
};
return GetToken(payload);
}

[Authorize(Roles = "Administrator")] 属性的问题在哪里?

最佳答案

问题在于声明的类型:

http://schemas.microsoft.com/ws/2008/06/identity/claims/role

不知何故,[Authorize] 属性在与 Roles 值一起使用时无法工作。所以这个 [Authorize(Roles = "Administartor")] 不起作用。您必须通过对 Startup 类应用转换将声明类型映射到仅 role

如果您有一个基于 Owin 的项目:

app.UseClaimsTransformation(incoming =>
{
// either add claims to incoming, or create new principal
var appPrincipal = new ClaimsPrincipal(incoming);
if (appPrincipal.HasClaim(x => x.Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/role"))
{
var value = appPrincipal.Claims.First(x =>
x.Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/role").Value;

incoming.Identities.First().AddClaim(new Claim("role", value));
}

return Task.FromResult(appPrincipal);
});

关于c# - 具有 jwt token 和身份的 asp core 2 中基于角色的授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47002417/

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