我在前端有一个带有SPA应用程序的项目,后端有一个ASP.NET WebAPI 2项目(.NET 4.6.1),并尝试使用Auth0设置身份验证/授权。
我的想法是让SPA使用Auth0小部件来生成持票人令牌,然后他们将此令牌传递回WebAPI,然后根据它来执行授权步骤。
我跟进了快速入门WebAPI 2,它基本上在Startup.cs中有一个重要的设置:
public void Configuration(IAppBuilder app)
{
var domain = $"https://{ConfigurationManager.AppSettings["Auth0Domain"]}/";
var apiIdentifier = ConfigurationManager.AppSettings["Auth0ApiIdentifier"];
var keyResolver = new OpenIdConnectSigningKeyResolver(domain);
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
TokenValidationParameters = new TokenValidationParameters()
{
ValidAudience = apiIdentifier,
ValidIssuer = domain,
IssuerSigningKeyResolver = (token, securityToken, identifier, parameters) => keyResolver.GetSigningKey(identifier)
}
});
// Configure Web API
WebApiConfig.Configure(app);
}
然而,这个项目样本似乎已经过时了。
首先,它无法编译,因为IssuerSigningKeyResolver的签名已被更改 - 特别是'identifier'参数不再是SecurityKeyIdentifier类型,而是字符串。
其次,如果我只是注释掉这一行,并尝试运行它,我会得到例外:
Could not load type 'System.IdentityModel.DateTimeUtil' from assembly 'System.IdentityModel.Tokens.Jwt, Version=5.2.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.
项目包的版本是:
Auth0.Owin.OpenIdConnectSigningKeyResolver 1.0.0.0
Microsoft.Owin.Security.Jwt 4.0.0.0
Microsoft.IdentityModel.Tokens 5.2.1.0
我的问题是:有没有人知道WebAPI 2 QuickStart的工作示例,或者在上述场景中使用Auth0的其他方式?
答案 0 :(得分:1)
问题是Microsoft在OWIN 4中进行了更改,从而破坏了Auth0 Nuget程序包。撰写此答案后,Auth0仅支持OWIN 3,请参见https://auth0.com/docs/quickstart/backend/webapi-owin#validate-access-tokens。
Auth0正在努力添加对OWIN 4的支持,请参见https://github.com/auth0/auth0-aspnet-owin/issues/60。
我在Github注释线程中找到了一些代码,这些代码使我能够将Auth0与我的项目中的OWIN 4一起使用。以下代码来自我的Startup.cs文件。
var domain = $"https://{config.Properties["Auth0Domain"]}/";
var apiIdentifier = config.Properties["Auth0ApiIdentifier"] as string;
//var keyResolver = new OpenIdConnectSigningKeyResolver(domain);
//app.UseJwtBearerAuthentication(
// new JwtBearerAuthenticationOptions
// {
// AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
// TokenValidationParameters = new TokenValidationParameters()
// {
// ValidAudience = apiIdentifier,
// ValidIssuer = domain,
// IssuerSigningKeyResolver = (token, securityToken, identifier, parameters) => keyResolver.GetSigningKey(identifier)
// }
// });
var configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(
domain.TrimEnd('/') + "/.well-known/openid-configuration",
new OpenIdConnectConfigurationRetriever());
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
TokenValidationParameters = new TokenValidationParameters()
{
ValidAudience = apiIdentifier,
ValidIssuer = domain,
IssuerSigningKeyResolver = (token, securityToken, identifier, parameters) =>
{
var openIdConnectConfig = Task.Run(() => configurationManager.GetConfigurationAsync()).GetAwaiter().GetResult();
return openIdConnectConfig.SigningKeys;
}
}
});
注释掉的代码是原始Auth0 OWIN示例代码。要编译此代码段,请从packages.config文件中删除Auth0.OpenIdConnectSigningKeyResolver NuGet包和Microsoft.IdentityModel.Protocol.Extensions NuGet包,然后在Startup.cs文件中更新using语句。
编辑:Auth0.OpenIdConnectSigningKeyResolver nuget软件包的2.0.0版本支持OWIN4。使用该软件包代替此代码。