首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有jwt令牌和标识的asp核2中基于角色的授权

带有jwt令牌和标识的asp核2中基于角色的授权
EN

Stack Overflow用户
提问于 2017-10-29 16:16:14
回答 1查看 1.7K关注 0票数 2

我尝试过一些在asp core 2中使用jwt令牌和asp核心标识的授权示例。我遵循了这段代码https://github.com/SunilAnthony/SimpleSecureAPI,它运行得很好。

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

结果很奇怪。我的控制器方法:

代码语言:javascript
复制
[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”数组中的有效负载中添加了字符串角色名称列表:

它是硬编码的,但是我更改了我的登录方法,只是为了测试,如下所示:

代码语言:javascript
复制
[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

代码语言:javascript
复制
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")]属性的问题在哪里?

EN

回答 1

Stack Overflow用户

发布于 2019-02-07 10:43:22

问题在于索赔的类型:

代码语言:javascript
复制
http://schemas.microsoft.com/ws/2008/06/identity/claims/role

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

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

代码语言:javascript
复制
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);
            });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47002417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档