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 的最新设置的主要内容,如果未能解决你的问题,请参考以下文章

Auth0,带有授权扩展和 ASP.NET 授权

Auth0 的合适 Azure 替代品

Auth0 .NET Core - 从 access_token 读取权限

如何从 auth0 中的访问令牌中获取 jwt 令牌

使用 Auth0 在 ASP.NET 中按角色/组进行授权

如何更改 Auth0 Lock 中显示的标题?