Asp.net web api IdentityServer 3:如何在ASP.NET WebAPI中验证索赔实体

Asp.net web api IdentityServer 3:如何在ASP.NET WebAPI中验证索赔实体,asp.net-web-api,identityserver3,Asp.net Web Api,Identityserver3,我将IdentityServer 3与ResourceOwner流一起使用。 它似乎起作用了。我可以在fiddler中看到令牌被我的WebAPI访问和验证 app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions { Authority = "http://server/IdentityServer/", V

我将IdentityServer 3与ResourceOwner流一起使用。 它似乎起作用了。我可以在fiddler中看到令牌被我的WebAPI访问和验证

     app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
     {
        Authority = "http://server/IdentityServer/",
        ValidationMode = ValidationMode.ValidationEndpoint,
        RequiredScopes = new[] { "MyFramework" },
        SigningCertificate = Certificate.Get(),
        DelayLoadMetadata = true
     });
如果我配置: ValidationMode=ValidationMode.ValidationEndpoint 还有一个额外的要求。 使用ValidationMode.Local,则没有。(这很好,因为IdentityServer嵌入在WebAPI中)

但是如果我使用ValidationMode.Local,则有两个对IdentityServer的请求。

为什么这是必要的?IdentityServer是嵌入式的,可以在内存中访问此信息。即使设置为“ValidationMode.ValidationEndpoint”,这两个调用也不会出现

但回到我的主要问题: 如何在WebAPI中验证索赔实体? 我有一个“AuthenticationHandler”(ASP.NET DelegatingHandler),用于处理旧的基本身份验证的验证

我发现我可以使用HttpContext.Current.User访问IPrincipal。 现在我检查它的类型为“ClaimSideEntity”,并且标识为

这是正确的方法吗? 如何检查用户ID

在服务器端,用户的ID被放在“sub”声明(又名“Subject”)中。 我是否必须访问此特定属性才能检查哪个用户已登录

我可以这样访问它: ClaimsIdentity.Claims.FirstOrDefault(c=>c.Type.Equals(“sub”)

但仅在设置为“ValidationMode.ValidationEndpoint”时使用。 然后,IPrincipal的AuthenticationType为“Bearer”,并且存在“sub”声明

设置为“ValidationMode.Local”时,AuthenticationType为“JWT”,并且声明不存在

为什么ValidationMode会更改IPrincipal?我需要检查不同的情况吗