WebAPI 2 项目中 Auth0 的最新设置
Posted
技术标签:
【中文标题】WebAPI 2 项目中 Auth0 的最新设置【英文标题】:Up-to-date setup for Auth0 in WebAPI 2 project 【发布时间】:2018-09-26 13:34:25 【问题描述】:我在前端有一个带有 SPA 应用程序的项目,在后端有一个 ASP.NET WebAPI 2 项目 (.NET 4.6.1),并尝试使用 Auth0 设置身份验证/授权。
我的想法是让 SPA 使用 Auth0 小部件来生成不记名令牌,然后他们将此令牌传递回 WebAPI,在那里将根据它采取授权步骤。
我浏览了 WebAPI 2 的 QuickStart,它基本上在 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 的其他方式?
【问题讨论】:
嗨,你找到答案了吗? @MatthewHartz 是的 - 我从 Auth0 支持得到的答案是,这是 MS 软件包的问题,他们没有解决方案/解决方法。我决定迁移到 Core WebAPI...与 Auth0 的集成顺利进行。 【参考方案1】:问题是微软在 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示例代码。要编译此 sn-p,请从 packages.config 文件中删除 Auth0.OpenIdConnectSigningKeyResolver NuGet 包和 Microsoft.IdentityModel.Protocol.Extensions NuGet 包,并更新 Startup.cs 文件中的 using 语句。
编辑:Auth0.OpenIdConnectSigningKeyResolver nuget 包的 2.0.0 版支持 OWIN 4。使用该包而不是此代码。
【讨论】:
哇。真的帮了我很多。我可以看到他们已弃用,但他们没有正确更新文档。我找不到 .Net Framework 中的 API 示例以上是关于WebAPI 2 项目中 Auth0 的最新设置的主要内容,如果未能解决你的问题,请参考以下文章