Идентификационный сервер 4: перехватить 302 и заменить его на 401 - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть приложение, которое одновременно размещает Identity Server 4 и клиентское приложение (Vue), которое использует несколько служб отдыха, определенных в области для управления сайтом.Идея состоит в том, что пользователи, связанные с определенной ролью, могут получить доступ к клиентскому приложению и вызвать остальные службы для выполнения действий.

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

Если бы это было простое приложение для ядра aspnet, то я бы просто передал лямбду свойству OnRedirectToLogin обработчика cookie, который обрабатывает запрос.К сожалению, IS4 позволит мне установить только несколько основных настроек куки (срок действия и скольжение).Те же самые документы говорят, что я могу переопределить обработчик файлов cookie.Итак, я попытался сделать следующее:

services.AddIdentityServer()
  ... // other configurations

services.AddAuthentication(sharedOptions => {
            sharedOptions.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;//IdentityServerConstants.ExternalCookieAuthenticationScheme;
            sharedOptions.DefaultChallengeScheme = IdentityServerConstants.SignoutScheme;

})
... //other external providers...
.AddCookie( CookieAuthenticationDefaults.AuthenticationScheme, options => {
     options.Events = new CookieAuthenticationEvents {
        OnRedirectToLogin = ctx => {
          if (ctx.Request.Path.StartsWithSegments("/Admin", StringComparison.OrdinalIgnoreCase)) {
               ctx.Response.StatusCode = (int) HttpStatusCode.Unauthorized;
          }
          return Task.CompletedTask;                                                                                                   
         };
      });

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

Спасибо

РЕДАКТИРОВАТЬ : просто чтобы добавить, что я также использую удостоверение aspnet для управления учетными записями пользователей ...

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Размещение ответа здесь на тот случай, если кому-то будет интересно ...

После некоторых копаний я обнаружил, что использование идентификатора означает, что вы не можете настроить обработчик cookie, выполняя то, что делал я.К счастью, ConfigureAuthenticationEvent, который можно настроить с помощью метода расширения ConfigureApplicationCookie, уже делает правильные вещи: если он обнаруживает, что текущий запрос является вызовом AJAX, он вернет 401;если нет, он вернет 302. И здесь была проблема: запрос, сделанный от клиента vue, не рассматривался как запрос AJAX, потому что он не устанавливал заголовок X-Request-With в XMLHttpRequest.

Итак, все, что требовалось, это настроить axios для установки заголовка во всех вызовах:

axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
0 голосов
/ 06 февраля 2019

Некоторое время назад я написал промежуточное программное обеспечение именно для этой цели и никогда не оглядывался назад, поэтому, если вы не найдете лучшего решения, возможно, решение также поможет вам:

public class RedirectHandlingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<RedirectHandlingMiddleware> _logger;

    public RedirectHandlingMiddleware(RequestDelegate next, ILogger<RedirectHandlingMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task Invoke(HttpContext context)
    {
        await HandleRedirect(context, ex);
        await _next(context);
    }

    private Task HandleRedirect(HttpContext context)
    {
        if (context.Request.Path.StartsWithSegments("/Admin", StringComparison.OrdinalIgnoreCase) && context.Response.StatusCode == 302)
        {
            context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
        }
        return Task.CompletedTask;
    }
}

Просто нужно зарегистрироваться вStartup.cs:

        app.UseAuthentication();
        app.UseMiddleware<RedirectHandlingMiddleware>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...