User.Identity.Name равно нулю в asp. net core + angular клиентском приложении. - PullRequest
0 голосов
/ 06 марта 2020

Я использую следующую команду. net cli:

dotnet new angular -o MyAngularApp -au individual

В результате получается ожидаемый. net базовый проект Web Api со встроенным клиентским приложением Angular, которое имеет пример защищенного API Контроллер и пример защищенного клиентского маршрута.

Затем я запускаю приложение и добавляю пользователя.

Я добавляю следующие 2 строки в авторизованное действие по умолчанию WeatherForecastsController get для исследования состояния пользователя:

[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
    var isAuthenticated = User.Identity.IsAuthenticated; //1
    var userId = userManager.GetUserId(User); //2

И после проверки userId это значение равно NULL, и isAuthenticated имеет значение true.

enter image description here

Хотя на стороне клиента (браузер chrome) ) Я вижу, что пользовательские данные хранятся в cook ie, а контроллер Api защищен атрибутом Authorize. Похоже, что пользовательская информация не распространяется в контроллере API.

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

Startup.cs ConfigureServices

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlite(
                    Configuration.GetConnectionString("DefaultConnection")));

            services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
                .AddEntityFrameworkStores<ApplicationDbContext>();

            services.AddIdentityServer()
                .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();

            services.AddAuthentication()
                .AddIdentityServerJwt();
            services.AddControllersWithViews();
            services.AddRazorPages();
            // In production, the Angular files will be served from this directory
            services.AddSpaStaticFiles(configuration =>
            {
                configuration.RootPath = "ClientApp/dist";
            });
        }

Startup.cs Настроить метод

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            if (!env.IsDevelopment())
            {
                app.UseSpaStaticFiles();
            }

            app.UseRouting();

            app.UseAuthentication();
            app.UseIdentityServer();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller}/{action=Index}/{id?}");
                endpoints.MapRazorPages();
            });

            app.UseSpa(spa =>
            {
                // To learn more about options for serving an Angular SPA from ASP.NET Core,
                // see https://go.microsoft.com/fwlink/?linkid=864501

                spa.Options.SourcePath = "ClientApp";

                if (env.IsDevelopment())
                {
                    spa.UseAngularCliServer(npmScript: "start");
                }
            });
        }

luanchSettings. json

{
  "iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": false,
    "iisExpress": {
      "applicationUrl": "http://localhost:62083",
      "sslPort": 44373
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "MyAngularApp": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

1 Ответ

0 голосов
/ 06 марта 2020

Если обнаружено, что в. Net Базовая + Angular базовая настройка заполняется следующая заявка и предоставляется Идентификатор пользователя.

User.FindFirstValue(ClaimTypes.NameIdentifier)

С помощью идентификатора пользователя мы можем получить пользователя приложения и делайте все, что нам нужно, в моем случае это проверка ролей в actionfilter перед выполнением указанного c действия контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...