WebAPI 2项目中Auth0的最新设置

时间:2018-04-16 18:03:41

标签: c# asp.net-web-api2 auth0

我在前端有一个带有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的其他方式?

1 个答案:

答案 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。使用该软件包代替此代码。