Можно ли использовать токены для API и файлов cookie для получения страницы Razor или действия контроллера в одном приложении с использованием сервера идентификации? - PullRequest
0 голосов
/ 04 августа 2020

У меня есть проект SPA с. net core 3.1 и сервером идентификации и реакцией. Я хочу авторизовать API с помощью токена и авторизовать действие контроллера или страницы Razor с файлами cookie в запросе Get. Можно ли использовать их оба в такое же приложение? Например, я хочу, чтобы административная область была авторизована с помощью cook ie, а администратор имел доступ к своим представлениям с помощью cook ie, но область пользователя работает с response и Api по токену.

Startup.cs:

        public void ConfigureServices(IServiceCollection services)
                {
                    services.AddDbContext<ApplicationDbContext>(options =>
                        options.UseSqlServer(
                            Configuration.GetConnectionString("DefaultConnection")));
        
                    services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>()
                        .AddEntityFrameworkStores<ApplicationDbContext>();
        
                    var builder = services.AddIdentityServer()
                        .AddApiAuthorization<IdentityUser, ApplicationDbContext>();
    
                    builder.Services.ConfigureExternalCookie(options => {
                        options.Cookie.IsEssential = true;
                        options.Cookie.SameSite = (SameSiteMode.Unspecified); 
                    });
        
                    builder.Services.ConfigureApplicationCookie(options => {
                        options.Cookie.IsEssential = true;
                        options.Cookie.SameSite = (SameSiteMode.Unspecified); 
                    });
        
                    services.AddAuthentication()
                        .AddIdentityServerJwt();
        
                    services.AddControllersWithViews();
                    services.AddRazorPages();
                    services.AddMvc().AddNewtonsoftJson(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
        
                  
                    services.AddSpaStaticFiles(configuration =>
                    {
                        configuration.RootPath = "ClientApp/build";
                    });
    }

  public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }

            app.UseStaticFiles();
            app.UseSpaStaticFiles();

            app.UseRouting();

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

            app.UseSpa(spa =>
            {
                spa.Options.SourcePath = "ClientApp";

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

1 Ответ

0 голосов
/ 04 августа 2020

Да, в ASP. Net основном приложении можно авторизоваться с разными схемами авторизации, вам просто нужно указать это в теге [Authorize], который вы вызываете перед методом.

Сначала вам нужно добавить обе аутентификации при вызове services.AddAuthentication().

Затем, допустим, вы хотите, чтобы ваш метод аутентифицировался с помощью токена JWT:

[Authorize(AuthenticationSchemes = 
JwtBearerDefaults.AuthenticationScheme)]

С другой стороны, если вы хотите, чтобы он аутентифицировался у повара ie:

[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]

Подробнее о том, как это работает, можно узнать на https://docs.microsoft.com/en-us/aspnet/core/security/authorization/limitingidentitybyscheme?view=aspnetcore-3.1.

...