我有一个小测试场景(一个托管IdentityServer3的授权服务,一个Web API和一个控制台客户端),当从控制台客户端调用API时,控制器“Identity”是一个ClaimsIdentity(正如预期的那样),但是从Fiddler调用API时,Identity是WindowsIdentity。该场景专门使用引用令牌,因此所有API令牌验证都会从WebAPI调用授权服务,以验证Web API头上提供的引用令牌。 Web API目前正在IIS Express中托管。
Web API的Owin Startup.cs如下所示
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
app.UseIdentityServerBearerTokenAuthentication( new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "https://localhost:5005/",
ValidationMode = ValidationMode.ValidationEndpoint,
} );
app.UseWebApi( config );
控制台客户端(在WebAPI控制器中正确地以ClaimIdentity结尾)使用以下HttpClient代码调用API:
var client = new HttpClient();
client.SetBearerToken( accessToken );
var result = client.GetStringAsync( "http://localhost:5000/Account" ).Result;
return result;
“原始”Fiddler声明(错误地(在我看来)导致WindowsIdentity)如下:
GET http://localhost:5000/account/ HTTP/1.1
User-Agent: Fiddler
Host: localhost:5000
Accept: application/json
Connection: Keep-Alive
Authorization: Bearer <reference token>
Content-Length: 0
我已经验证了Headers和其他“请求”参数(消息处理程序集合等)在两个场景之间是相同的。我试过了
config.SuppressHostPrincipal()
但这会“破坏”控制台客户端行为(导致“空”ClientIdentity)。我也试过
JwtSecurityTokenHandler.InboundClaimTypeMap.Clear();
没有成功。我已经多次浏览了Web.config和Web API .csproj文件,但却找不到任何解释我所看到的WindowsIdentity行为的内容。
我怀疑存在额外的Web API身份验证中间件,它绕过了从Fiddler发出请求时执行的UseIdentityServerBearerTokenAuthentication中间件,但是我无法跟踪它。
我最初将此作为Fiddler的环境问题写下来,但现在我正在尝试将UseIdentityServerBearerTokenAuthentication机制集成到我们的生产代码库中,无论客户端(Fiddler或原始HttpClient)我在生产Web API中获取WindowsIdentity行为通过控制台应用程序)任何想法将不胜感激。谢谢!
答案 0 :(得分:0)
我在“输出”窗口中发现以下错误:
Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationMiddleware Error: 0 : Authentication failed
System.IO.FileLoadException: Could not load file or assembly 'IdentityModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. A strongly-named assembly is required. (Exception from HRESULT: 0x80131044)
File name: 'IdentityModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
at IdentityServer3.AccessTokenValidation.ValidationEndpointTokenProvider.<ReceiveAsync>d__1.MoveNext()
at System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start[TStateMachine](TStateMachine& stateMachine)
at IdentityServer3.AccessTokenValidation.ValidationEndpointTokenProvider.ReceiveAsync(AuthenticationTokenReceiveContext context)
at Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationHandler.<AuthenticateCoreAsync>d__0.MoveNext()
我们的产品已签名,因此我之前签署了IdentityServer3和IdentityModel程序集,这意味着IdentityServer3对IdentityModel的引用,PublicKeyToken = null失败。在深入了解IdentityServer3的IL并更改引用以期望适当的密钥之后,一切都运行良好。