0

我已经将 Identity Server 3 与 Membership 重新启动数据库设置为我的授权服务器,并且还开发了一个 Web Api 项目,该项目将由一个 javascript Web 应用程序访问。

使用隐式流,客户端能够登录并获得 id_token 和 access_token。现在我有几个问题,我也希望得到一些详细的答案:

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

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

  3. 在 web api 控制器中,我想使用以下方式访问用户的信息:

    var user = 作为 ClaimsPrincipal 的用户;

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

非常感谢任何额外的信息。

4

1 回答 1

1
  1. id_token 应该在客户端使用。您可以使用它来访问客户端的声明。AccessToken 将在 API 中使用。

  2. 对于要包含在 access_token 中的声明,您需要创建一个包含相关声明的范围并在请求中请求该范围。要创建范围(在自托管示例中将范围添加到 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;
    }

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

  1. 在 Web API 启动中使用相关的中间件配置您的 API(在SampleAspNetWebApi示例中,如下所示)

    app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions { Authority = " 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
                   };
于 2016-01-21T05:52:18.150 回答