Подходящее место для проверки издателя для мультитенантного приложения .Net Core Web API - PullRequest
0 голосов
/ 31 декабря 2018

Я разрабатываю мультитенантное SPA-приложение, которое вызывает внутренний интерфейс .Net Core Web API для данных.Интерфейс внешнего интерфейса будет использовать MSAL и общую конечную точку Microsoft v2 для аутентификации пользователя по AAD и получения идентификатора и токена доступа.

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

Я видел ссылки на пару мест, где можно переопределить или настроить проверку токена, но яЯ не уверен, какой из них предпочтителен, или один из этих методов вызывает нежелательные побочные эффекты.

Один метод использует параметры событий JwtBearer: options.Events.TokenValidated, а другой - делегат IssuerValidator TokenValidationParameters.

Я не хочу писать какую-либо логику проверки токена, за исключением того, что в моей базе данных проверенных издателей есть эмитент.Должна ли эта логика входить в IssuerValidator или TokenValidated?

Мой текущий код выглядит следующим образом (в настоящее время настроен для одного арендатора)

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
   .AddJwtBearer(options =>
    {
       options.Authority = "https://myauthority.com";
       options.Audience = "https://myaudience.com/api/v1";
       options.TokenValidationParameters = new TokenValidationParameters
       {  
          ValidateIssuer = true,
          ValidIssuer = "myauthority.com",
          ValidateAudience = true,
          ValidAudience = "https://myaudience.com",
          ValidateLifetime = true,
          ValidateIssuerSigningKey = true,
        };
    });

Одна из проблем, с которыми я сталкиваюсьиспользование IssuerValidator заключается в том, что не существует способа внедрить или передать ссылку на dbContext, необходимый для возможности поиска идентификатора арендатора в базе данных.

Кто-нибудь занимался этим или сделал?что-то похожее?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Ух ты, так что это привело меня в долгий путь!Как вы указали, большинство документов указывают на установку ValidateIssuer = false и оставление на этом.Я попробовал IssuerValidator и ничего не получил.То, что я нашел, было IAuthorizationHandler.Я создал PoC, используя IMyService вместо DBContext.Я оставил ValidateIssuer = false.

public class IssuerAuthorizationHandler : IAuthorizationHandler
{
    private readonly IMyService _service;

    public IssuerAuthorizationHandler(IMyService service)
    {
        _service = service ?? throw new ArgumentNullException(nameof(service));
    }

    public Task HandleAsync(AuthorizationHandlerContext context)
    {
        if (context.User.FindFirst("iss") != null)
        {
            string issuer = context.User.FindFirst("iss").Issuer;
            // do issuer validation here
        }
        else
        {
            // fail the authentication
            context.Fail();
        }

        return Task.CompletedTask;
    }
}

Добавьте это к DI

services.AddScoped<IAuthorizationHandler, IssuerAuthorizationHandler>();

Надеюсь, что эта помощь

Обновление:

Фильтр конвейера показывает, когда вызывается обработчик авторизации

core pipeline

0 голосов
/ 02 января 2019

Вы можете проверить, что в OnTokenValidated событии, чтобы получить доступ к контексту базы данных, вы можете попробовать:

 options.Events.OnTokenValidated = async (context) =>
   {


       var dbContext = context.HttpContext.RequestServices.GetRequiredService<BloggingContext>();
       var blogs = await dbContext.Blogs.ToListAsync();

       if (!true)
       {
           throw new SecurityTokenValidationException($"Tenant xxxxx is not registered");
       }

   };
...