Актуальная настройка для Auth0 в проекте WebAPI 2

У меня есть проект с приложением SPA на интерфейсе и проект ASP.NET WebAPI 2 (.NET 4.6.1) на сервере, и я пытаюсь настроить аутентификацию/авторизацию с помощью Auth0.

Моя идея заключалась в том, чтобы SPA использовала виджет Auth0 для создания токена-носителя, и они передавали этот токен обратно в WebAPI, где на его основе будут предприниматься шаги авторизации.

Я выполнил QuickStart для 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 была изменена — в частности, параметр «идентификатор» больше не имеет тип 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 в описанном выше сценарии?


person 1atera1usz    schedule 16.04.2018    source источник
comment
Привет, ты нашел ответ на этот вопрос?   -  person Matthew Hartz    schedule 01.06.2018
comment
@MatthewHartz Да, ответ, который я получил от службы поддержки Auth0, заключается в том, что это проблема с пакетами MS, для которой у них нет решения/обходного пути. Я решил перейти на Core WebAPI... там интеграция с Auth0 прошла гладко.   -  person 1atera1usz    schedule 05.06.2018


Ответы (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. Чтобы скомпилировать этот фрагмент, удалите NuGet-пакет Auth0.OpenIdConnectSigningKeyResolver и Microsoft.IdentityModel.Protocol.Extensions из файла packages.config и обновите операторы using в файле Startup.cs.

Изменить: версия 2.0.0 пакета nuget Auth0.OpenIdConnectSigningKeyResolver поддерживает OWIN 4. Используйте этот пакет вместо этого кода.

person dfjacobs    schedule 05.07.2018
comment
Ух ты. Мне действительно очень помог. Я мог видеть, что они устарели, но они не обновили документы должным образом. Нет примеров, которые я мог бы найти для API в .Net Framework. - person Shahzad; 08.07.2019