身份服务器声称asp.net API

时间:2016-01-04 18:02:37

标签: angularjs asp.net-web-api identityserver3

我正在编写一个角度应用程序,首先对think texture identityserver3进行身份验证。 这很好,我收到了没有任何问题的持有人令牌。 当我在调用API时使用我的令牌时,我已通过身份验证。我可以看到我的用户ID,但丢失了我的声明(用户名,角色,...)。 如何使用我的令牌转移我的声明,或从身份服务器获取角色,我该怎么办?

2 个答案:

答案 0 :(得分:1)

您可以通过将声明添加到API的范围,告知Identity Server在访问令牌中包含特定声明。

示例:

var apiScope = new Scope {
    Name = "myApi",
    DisplayName = "My API",
    Type = ScopeType.Resource,
    Claims = new List<ScopeClaim> {
        new ScopeClaim("myClaimType")
    }
};

您还可以使用AlwaysIncludeInIdToken的{​​{1}}属性将声明包含在身份令牌和访问令牌中。

有关详细信息,请参阅https://identityserver.github.io/Documentation/docsv2/configuration/scopesAndClaims.html

答案 1 :(得分:0)

我们正在使用MS Web API 2和Thinktecture Identity Server v3做类似的事情。

为了验证用户的声明,我们创建了一个身份验证过滤器,然后直接调用身份服务器来获取用户的声明。承载令牌仅授予身份验证,由API单独获取声明。

protected override bool IsAuthorized(HttpActionContext actionContext)
    {
      string identityServerUrl = WebConfigurationManager.AppSettings.Get("IdentityServerUrl") + "/connect/userinfo";

      using (var httpClient = new HttpClient())
      {
        httpClient.DefaultRequestHeaders.Authorization = actionContext.Request.Headers.Authorization;

        var response = httpClient.GetAsync(identityServerUrl).Result;
        if (response.IsSuccessStatusCode)
        {
          string responseString = response.Content.ReadAsStringAsync().Result;
              Dictionary<string, string> claims = JsonConvert.DeserializeObject<Dictionary<string, string>>(responseString.ToLower());
          ... Do stuff with your claims here ...
        }
    }
}