Добавление [Авторизовать] к контроллеру, не перенаправляющему на маршрут входа в систему идентификации. ASP.NET ЯДРО 3.1 MVC

#asp.net-core #asp.net-mvc-3 #asp.net-core-identity #asp.net-core-routing

#asp.net-ядро #asp.net-mvc-3 #asp.net-core-identity #asp.net-core-routing

Вопрос:

У меня есть asp.net основной проект 3.1 MVC. К нему добавлена идентификация. Когда я обычно нажимаю кнопку, чтобы перейти на страницу входа в систему или страницу регистрации, все работает должным образом. Однако в тот момент, когда я использую [Авторизовать] на контроллере или фильтр глобальной авторизации в файле Startup.cs, страница не перенаправляется на страницу входа.

Ссылка перенаправления в этом случае

https://localhost:5001/Account/Login ?returnUrl=/

где в качестве ссылки должна быть

https://localhost:5001/Identity/Account/Login ?returnUrl=/

Если вы внимательно посмотрите, в ссылке, которую я получаю, отсутствует название области «Identity». Я подозреваю, что что-то не так с моей конфигурацией файла Startup.cs, но не могу понять, что именно. У меня есть несколько областей в моем проекте вместе с идентификатором

Startup.cs

 public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // 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.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        /*services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();*/

        services.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();
        services.AddTransient<IEmailSender, EmailSender>();
        services.AddControllersWithViews();
        services.AddRazorPages().AddMvcOptions(options => options.Filters.Add(new AuthorizeFilter()));
        services.AddSingleton<IConfiguration>(Configuration);
        services.AddMvc(options => options.EnableEndpointRouting = false);
        services.AddMvc().AddRazorRuntimeCompilation();
    }

    // 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("/Home/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();

        app.UseRouting();

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

        app.UseEndpoints(endpoints =>
        {

            endpoints.MapRazorPages().RequireAuthorization();
            endpoints.MapControllerRoute(
               name: "Identity",
               pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });
    }
}
  

Любая помощь была бы очень признательна. Спасибо.

Ответ №1:

Определите путь входа следующим services.ConfigureApplicationCookie образом:

 services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = new PathString("/Identity/Account/Login");
    //other properties
});
  

Комментарии:

1. @Mill3r Добро пожаловать! и просто напоминание ConfigureApplicationCookie также может указать ваш LogoutPath и AccessDenied путь, вы можете найти их полезными.

Ответ №2:

Я только что осмотрелся на GitHub и обнаружил Account/Login , что он установлен по умолчанию в CookieAuthenticationDefaults. Затем я обнаружил, что это используется PostConfigureCookieAuthenticationOptions, который устанавливает разумные параметры конфигурации, когда ни один из них не был указан. Исходя из этого, мне кажется, что вы должны настроить это следующим образом:

 services.ConfigureApplicationCookie(x => x.LoginPath = "/identity/account/login");
  

x в этом случае имеет тип CookieAuthenticationOptions , из которого PostConfigureCookieAuthenticationOptions выполняется чтение.

Комментарии:

1. Хорошо, я слишком медленный. 🙂