Я работаю на стороне сервера Blazor и хочу получить доступ к имени пользователя Windows. Я попытался сделать это согласно документации, используя объект AuthenticationStateProvider. Проблема в том, что свойство User Name имеет значение null, когда я запускаю решение в режиме выпуска. В экспресс-режиме он работает нормально, я могу получить свойство User Name, в режиме выпуска значение равно нулю.

Это объект AuthenticationStateProvider:

       public class Authenticator
    {
        public readonly AuthenticationStateProvider _auth;

        public Authenticator(AuthenticationStateProvider authenticationStateProvider)
        {
            _auth = authenticationStateProvider;
        }
    }

Я ввожу его в Startup.cs:

services.AddScoped<Authenticator>();

Я включил аутентификацию Windows:

     "iisSettings": {
        "windowsAuthentication": true,
        "anonymousAuthentication": false,
        "iisExpress": {
          "applicationUrl": "http://localhost:49349",
          "sslPort": 0
        }
      }

Вот как я использую объект:

return _auth.GetAuthenticationStateAsync().Result.User.Identity.Name.Substring(3);

Я также включил WebSocketProtocol:

enter image description here

Свойство Name объекта User имеет значение null, только в режиме выпуска, в обычном режиме отладки в IIS Express оно работает должным образом.

Я использую ASP.NET CORE 3.1 с Visual Studio 16.9.4. У меня также возникла эта проблема с Windows Server 2012 после публикации приложения на ISS.

РЕДАКТИРОВАТЬ 1: У меня такая же проблема при использовании IHttpContextAccessor с Blazor-Server. Он получает имя пользователя в IIS Express, но в режиме выпуска имя имеет значение null.

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

0
Daniel 17 Май 2021 в 11:39

2 ответа

Лучший ответ

Если кто-то еще столкнется с этой проблемой, мне удалось заставить ее работать, установив среду выполнения ASP.NET Core 5.0 (v5.0.6) - пакет хостинга Windows и модуль перезаписи URL. Я также добавил полные права на публикацию папки для пользователей NETWORK и IIS_IUSRS, а также изменил авторизацию веб-приложений IIS и отключил все, кроме авторизации Windows.

Проблема, похоже, связана с тем, что сервер IIS не может прочитать настройки авторизации веб-сайта или файл webconfig решения. Странно то, что на самом сервере вообще не было ошибки в IIS, но ошибка появилась, когда я запускаю приложение на локальном сервере IIS.

0
Daniel 18 Май 2021 в 11:44
 // Add Identity  Order = 1 !important
        services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
        {
            options.Password.RequiredLength = ConfigIdentity.Password_RequiredLength;
            options.Password.RequireLowercase = ConfigIdentity.Password_RequireLowercase;
            options.Password.RequireUppercase = ConfigIdentity.Password_RequireUppercase;
            options.Password.RequireNonAlphanumeric = ConfigIdentity.Password_RequireNonAlphanumeric;
            options.Password.RequireDigit = ConfigIdentity.Password_RequireDigit;
        }).AddUserManager<UsersManager>().AddRoleManager<RolesManager>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();

        // Database Contexts Order = 2 !important
        services.AddDbContext<ApplicationDbContext>(ServiceLifetime.Transient);

        // 3 : Cookie Options  
        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });
        services.ConfigureApplicationCookie(options =>
        {
            options.AccessDeniedPath = "/Error/AccessDenied";
            options.Cookie.Name = "MyAPP";
            options.Cookie.HttpOnly = true;
            options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
            options.LoginPath = "/";
            //options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
            options.SlidingExpiration = true;
        });



services.AddHttpContextAccessor();
        services.AddRazorPages();
        services.AddControllers();
        services.AddServerSideBlazor().AddCircuitOptions(options => { options.DetailedErrors = true; });
        services.AddScoped<AuthenticationStateProvider, RevalidatingIdentityAuthenticationStateProvider<IdentityUser>>();
0
Ali Borjian 18 Май 2021 в 09:12