代码之家  ›  专栏  ›  技术社区  ›  Tom Troughton

使用Identity Server 3,即使在成功进行承载令牌身份验证后,ClaimsPrinciple也为null

  •  0
  • Tom Troughton  · 技术社区  · 7 年前

    我有一个测试控制台应用程序,我指向Identity Server 3的本地实例请求访问令牌。下面的代码执行此操作并返回我的令牌fine(传递单个作用域 "scope.test.client" ).

        static TokenResponse GetClientToken(string clientId, string clientSecret, string[] scopes)
        {
            var uri = new Uri(string.Concat(ID_BASE_URI, ID_URL_TOKEN));
    
            var client = new TokenClient(
                uri.AbsoluteUri,
                clientId,
                clientSecret);
    
            return client.RequestClientCredentialsAsync(string.Join(" ", scopes)).Result;
    

    然后,我使用这个令牌调用也在本地运行的API。这需要 TokenResponse 获取并将其传递给此方法:

        static void CallApi(string url, TokenResponse response)
        {
            try
            {
                using (var client = new HttpClient())
                {
                    client.SetBearerToken(response.AccessToken);
                    Console.WriteLine(client.GetStringAsync(url).Result);
                }
            }
            catch (Exception x)
            {
                Console.WriteLine(string.Format("Exception: {0}", x.Message));
            }
        }
    

    API(ASP.NET WebApi项目)使用Owin启动类对所有请求强制执行承载令牌身份验证:

            appBuilder.Map(baseApiUrl, inner =>
            {
                inner.UseWebApi(GlobalConfiguration.Configuration);
    
                // Enforce bearer token authentication for all API requests
                inner.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
                {
                    Authority = "https://identityserver/core",
                    ValidationMode = ValidationMode.ValidationEndpoint,
    
                    RequiredScopes = new[] { "scope.test.client" }
                });
            });
    

    GlobalConfiguration.Configuration.Filters.Add(new DefaultApiAuthorizeAttribute());
    

    OnAuthorize 方法(in DefaultApiAuthorizeAttribute

    var caller = actionContext.RequestContext.Principal as System.Security.Claims.ClaimsPrincipal;
    

    如果我在这条线上突破,我可以看到 actionContext.RequestContext.Principal 始终为空。然而,我可以看到 ((System.Web.Http.Owin.OwinHttpRequestContext)actionContext.RequestContext).Request.Headers

    因此,API项目似乎没有对承载令牌进行身份验证。当然,Identity Server日志表明,在发出初始访问令牌后,它根本没有受到攻击。所以我很感激你的专家建议,关于为什么这可能不会发生,或者至少一些关于在哪里寻找的指针。

    我怀疑这可能与SSL有关。虽然Identity Server配置为不需要SSL并使用idsrv3test,但这两个站点都在自签名SSL证书下本地托管。pfx开发证书供签署。我确实有另一个测试MVC web应用程序,它将身份验证委托给同一个IS3实例,该实例在本地运行良好,因此我相信我的IS3实例配置正确。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Kirk Larkin    7 年前

    你需要打电话 UseIdentityServerBearerTokenAuthentication 之前 UseWebApi . 当您设置OWIN中间件管道时,顺序很重要。