Оуин/Катана UseJwtBearerAuthentication всегда возвращает 401

Мне нужно реализовать JWT Bearer Authentication как в проекте веб-API .NET 4.6.1, так и в веб-проекте .NET Core 2.0.

Я успешно запустил основной проект с этим пример от Microsoft.

Я следую этому пример от Скотта Аллена для проекта .NET 4.6.1.

Мой код 4.6.1 выглядит так:

public void ConfigureAuth(IAppBuilder app)
    {
        // Application requuires AD Bearer tokens for access
        app.UseJwtBearerAuthentication(
            new JwtBearerAuthenticationOptions
            {
                AuthenticationMode = AuthenticationMode.Active,
                TokenValidationParameters = new TokenValidationParameters
                {
                    ValidIssuer = "https://validissuer.blahblah.com/",
                    ValidAudience = "https://validaudience.blahblah.com"
                }
            });
    }

Тот же токен будет корректно проверяться в .NET Core API, но не в .NET 4.6.1 API, и я полагаю, что упускаю что-то незначительное. Любые идеи?

Дополнительный вопрос: каковы наилучшие методы проверки того, что должно быть проверено в производственной среде? Оба экземпляра пытаются проверить эмитента и аудиторию, но стоит ли проверять что-то еще?

-Тим


person Tim_Cardwell    schedule 23.01.2018    source источник


Ответы (2)


Вам необходимо установить свойство IssuerSigningKey. Если вы не знаете, как получить ключ вручную, вот пример автоматического разрешения IssuerSigningKey по полномочиям:

using System.Linq;
using System.Threading;
using Microsoft.IdentityModel.Protocols;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using Microsoft.IdentityModel.Tokens;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Jwt;
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var authority = "https://<your-authority>/";
        var keyResolver = new OpenIdConnectSigningKeyResolver(authority);
        app.UseJwtBearerAuthentication(
            new JwtBearerAuthenticationOptions
            {
                AuthenticationMode = AuthenticationMode.Active,
                TokenValidationParameters = new TokenValidationParameters()
                {
                    AuthenticationType = "Bearer",
                    ValidIssuer = "https://<your-authority>/",
                    ValidateAudience = false,
                    ValidateIssuer = true,
                    RequireExpirationTime = true,
                    ValidateLifetime = true,
                    IssuerSigningKeyResolver = (token, securityToken, kid, parameters) => keyResolver.GetSigningKey(kid)
                }
            });
    }

    private class OpenIdConnectSigningKeyResolver
    {
        private readonly OpenIdConnectConfiguration openIdConfig;

        public OpenIdConnectSigningKeyResolver(string authority)
        {
            var cm = new ConfigurationManager<OpenIdConnectConfiguration>($"{authority.TrimEnd('/')}/.well-known/openid-configuration", new OpenIdConnectConfigurationRetriever());
            openIdConfig = AsyncHelper.RunSync(async () => await cm.GetConfigurationAsync());
        }

        public SecurityKey[] GetSigningKey(string kid)
        {
            // Find the security token which matches the identifier
            return new[] { openIdConfig.JsonWebKeySet.GetSigningKeys().FirstOrDefault(t => t.KeyId == kid) };
        }
    }

    private static class AsyncHelper
    {
        private static readonly TaskFactory TaskFactory = new TaskFactory(CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Default);

        public static void RunSync(Func<Task> func)
        {
            TaskFactory.StartNew(func).Unwrap().GetAwaiter().GetResult();
        }

        public static TResult RunSync<TResult>(Func<Task<TResult>> func)
        {
            return TaskFactory.StartNew(func).Unwrap().GetAwaiter().GetResult();
        }
    }
}
person capcom923    schedule 16.03.2020

Поскольку вы присвоили новый экземпляр TokenValidationParameters соответствующему свойству, я думаю, вы также должны указать действительный IssuerSigningKey.

    builder.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
        {
            AuthenticationMode           = AuthenticationMode.Active,
            TokenValidationParameters    = new TokenValidationParameters
            {
                AuthenticationType = "Bearer",
                ValidIssuer = "https://validissuer.blahblah.com/",
                ValidAudience = "https://validaudience.blahblah.com",
                IssuerSigningKey   = new InMemorySymmetricSecurityKey(Encoding.UTF8.GetBytes("MySecret")),
            }
        });
person Сергей Осташёв    schedule 11.04.2018