【问题标题】:Up-to-date setup for Auth0 in WebAPI 2 projectWebAPI 2 项目中 Auth0 的最新设置
【发布时间】: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 的集成顺利进行。

标签: c# asp.net-web-api2 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 示例
猜你喜欢
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多