身份服务器3隐式授予,基于角色的授权



我已经设置了身份服务器3与会员重启数据库作为我的授权服务器,还开发了一个Web Api项目,将由javascript Web应用程序访问。

使用隐式流程,客户端可以登录并获取id_token和access_token。现在我有几个问题,希望能得到详细的回答:

  1. id_token的功能是什么?拿到它后,我可以用它做什么?

  2. 用户的角色作为声明存储在数据库中(例如,"role","admin"的键值)。此时如何执行基于角色的授权?id_token似乎包含这些声明,但access_token没有。当沿着我的Api请求发送我的access_token作为承载时,Api如何知道发送用户具有哪些角色?

  3. 在一个web api控制器,我想访问用户的信息使用:

    var user = user as claimprincipal;

使用这段代码,我无法获得关于用户的任何信息;用户名、id等。此外,当我在控制器中使用user.Claims时,我无法访问存储在数据库中的索赔。怎么会有两组声明,一组在数据库中,一组在令牌中?!

    客户端应该使用
  1. id_token。您可以使用它在客户端访问索赔。

  2. 对于要包含在access_token中的声明,您需要创建一个具有相关声明的范围,并在请求中请求该范围。要创建一个作用域(在self-host示例中,将作用域添加到Scopes.cs):

    new Scope 
    {
                Name = "myApiScope",
                DisplayName = "IdentityManager",
                Type = ScopeType.Resource,
                Emphasize = true,
                ShowInDiscoveryDocument = false,
                Claims = new List<ScopeClaim>
                {
                    new ScopeClaim(Constants.ClaimTypes.Name),
                    new ScopeClaim(Constants.ClaimTypes.Role)
                }
    }
    

请求授权请求中的作用域(在Javascript隐式客户端中-简单的操作如下)

function getToken() {
        var authorizationUrl = 'https://localhost:44333/core/connect/authorize';
        var client_id = 'implicitclient';
        var redirect_uri = 'http://localhost:37045/index.html';
        var response_type = "token";
        var scope = "myApiScope";
        var state = Date.now() + "" + Math.random();
        localStorage["state"] = state;
        var url =
            authorizationUrl + "?" +
            "client_id=" + encodeURI(client_id) + "&" +
            "redirect_uri=" + encodeURI(redirect_uri) + "&" +
            "response_type=" + encodeURI(response_type) + "&" +
            "scope=" + encodeURI(scope) + "&" +
            "state=" + encodeURI(state);
        window.location = url;
    }

这将包括您的访问令牌中的名称和角色声明

  • 在web API启动中使用相关中间件配置API(在SampleAspNetWebApi示例中,操作如下)

    应用程序。UseIdentityServerBearerTokenAuthentication(新IdentityServerBearerTokenAuthenticationOptions{权限= "https://localhost:44333/core",RequiredScopes = new[] {"myApiScope"}});

  • 那么您可以按照以下方式访问声明

                var principal = User as ClaimsPrincipal;
                return from c in principal.Identities.First().Claims
                       select new 
                       {
                           c.Type,
                           c.Value
                       };
    

    相关内容

    • 没有找到相关文章

    最新更新