Устранение неполадок ASP.NET Базовая авторизация на основе ролей с проверкой подлинности Windows

#c# #asp.net-core #authorization #blazor-server-side

#c# #asp.net-ядро #авторизация #blazor-на стороне сервера

Вопрос:

Что касается автономного серверного приложения Blazor, размещенного в IIS, мы настроили приложение на использование проверки подлинности Windows и авторизации на основе ролей, полученных из групп Active Directory.

В Startup.cs

 public void ConfigureServices(IServiceCollection services)
{
    //...
    services.AddAuthentication(IISDefaults.AuthenticationScheme);
    //....
}

public static void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    //...
    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
    });
}
  

В приложении мы используем <AuthorizeView /> компонент и AuthenticationState для управления доступом.

У нас есть промежуточная среда и производственная среда. Насколько я знаю, конфигурация обеих сред идентична, за исключением ASPNETCORE_ENVIRONMENT Staging того, что на промежуточном сервере установлено значение is.

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

 @page "/diag"

<h3>Diag</h3>

<AuthorizeView>

    <div>
        User.Identity.IsAuthenticated: @context.User.Identity.IsAuthenticated
    </div>

    <div>
        User.Identity.AuthenticationType: @context.User.Identity.AuthenticationType
    </div>

    <div>
        AuthenticationStateContext.User.Identity.Name: @context.User.Identity.Name
    </div>

    <div>
        User.IsInRole(Administrator): @context.User.IsInRole(Roles.Administrator)
    </div>

</AuthorizeView>
  

Roles.Administrator является постоянной строкой, совпадающей с именем группы AD с administrators.

При входе в систему в качестве пользователя в группе администраторов промежуточный сервер выдает ожидаемый результат:

 User.Identity.IsAuthenticated: True
User.Identity.AuthenticationType: Negotiate
AuthenticationStateContext.User.Identity.Name: DOMAINmy.name
User.IsInRole(Administrator): True
  

Однако рабочий сервер проходит проверку подлинности, но не распознает роль:

 User.Identity.IsAuthenticated: True
User.Identity.AuthenticationType: Negotiate
AuthenticationStateContext.User.Identity.Name: DOMAINmy.name
User.IsInRole(Administrator): False
  

Насколько я понимаю, приложение IIS настроено для проверки подлинности Windows. Анонимная проверка подлинности отключена, включена проверка подлинности Windows. Проверка подлинности Windows, похоже, работает, но авторизация — нет.

Я ценю любые отзывы.

Редактировать

Продолжение устранения неполадок после первоначального вопроса. Открыл консоль разработчика браузера для каждого сайта и сравнил активность. Заметил, что у клиента, указывающего на промежуточный сервер, был только один запрос blazor с использованием URL-адреса websocket. Клиент, указывающий на рабочий сервер, сгенерировал много запросов blazor с использованием http — я думаю, это означает, что он был понижен до длительного опроса. Почему он не использовал websockets? После дальнейшего расследования я обнаружил, что на моем производственном веб-сервере не установлен модуль websocket! После установки приложение ведет себя так, как ожидалось.

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

Ответ №1:

Хотелось бы отметить ваше редактирование в качестве ответа. Для меня это тоже было решением проблемы. На сервере 2016 IIS мне пришлось установить модуль Websocket, используя инструкции здесь:

https://learn.microsoft.com/en-us/iis/configuration/system.webserver/websocket