在ASP.NET Core中未经授权时重定向到登录

gro*_*kky 19 c# asp.net asp.net-identity asp.net-core-mvc asp.net-core

在之前的ASP.NET MVC中,如果用户未经过身份验证,则可以选择重定向到登录操作.

我需要与ASP.NET Core相同的东西,所以我:

  1. 从Visual Studio模板创建了一个ASP.NET Core项目
  2. 添加[Authorize]到一些任意行动
  3. 在我的浏览器中打开相应的视图

我不希望重定向,因为我没有配置它.但是,它会自动重定向到登录操作!

这个选项在哪里/如何设置?

ani*_*ina 12

使用当前的aspnet核心版本(2.1.0),这已经改变了,现在使用可以使用扩展:

   services.ConfigureApplicationCookie(options => options.LoginPath = "/login");
Run Code Online (Sandbox Code Playgroud)

要么

 services
         .AddAuthentication()
         .AddCookie(options =>
         {
             options.LoginPath = "/login";
             options.LogoutPath = "/logout";
         });
Run Code Online (Sandbox Code Playgroud)

您可以在本文中看到有关迁移到2.0的更多信息.

  • 我想补充一点,“ConfigureApplicationCookie”应该放在“AddIdentity”之后**。否则没有效果。 (3认同)

Ser*_*gan 12

重定向在我的应用程序中根本不起作用,这里的解决方案都没有修复它,但使用Status Code Pages了:

app.UseStatusCodePages(async context => 
{
    var response = context.HttpContext.Response;

    if (response.StatusCode == (int)HttpStatusCode.Unauthorized ||
        response.StatusCode == (int)HttpStatusCode.Forbidden)
        response.Redirect("/Authentication");
});

app.UseMvc(...        
Run Code Online (Sandbox Code Playgroud)

  • 它应该是第一个或第一个,但肯定在 `app.UseMvc` 之前 (4认同)

小智 7

启动文件中的此代码块在 .Net Core 3.1 中适用于我

services.ConfigureApplicationCookie(options =>
    {
        // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

        options.LoginPath = "/Identity/Account/Login";
        options.AccessDeniedPath = "/Identity/Account/AccessDenied";
        options.SlidingExpiration = true;
    });

Run Code Online (Sandbox Code Playgroud)


Anu*_*raj 6

您可以使用CookieAuthenticationOptionsclass 配置路径。

这样的事情。

app.UseCookieAuthentication(new CookieAuthenticationOptions {
        LoginPath = new PathString("/Login/"),
        AuthenticationType = "My-Magical-Authentication",
        // etc...
        },
});
Run Code Online (Sandbox Code Playgroud)

  • 另外,我不仅要控制此设置,还想了解它的发生位置/方式。我不知道如何找到我的登录视图。这就是我想了解的。 (3认同)
  • @Anuraj 链接已失效,你知道新链接吗? (2认同)

Ant*_*hik 5

对于任何感兴趣的人,也可以通过 AddIdentity 服务提供者来完成。

services.AddIdentity<User, IdentityRole>(options =>
    {
        options.Cookies.ApplicationCookie.AutomaticAuthenticate = true;
        options.Cookies.ApplicationCookie.AutomaticChallenge = true;
        options.Cookies.ApplicationCookie.LoginPath = "/Auth/Login";
    })
    .AddEntityFrameworkStores<MehandiContext>()
    .AddDefaultTokenProviders();
Run Code Online (Sandbox Code Playgroud)

正如这里所解释的:https : //stackoverflow.com/a/41643105/5784635

我在 2017 年 4 月尝试过这个并且"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.1.0"没有重定向我必须使用该1.0.1版本


Rya*_*nes 5

dotnet core 支架 Cookie 身份验证的方式是使用身份框架。对于新项目,我建议进入命令行并执行如下操作:

dotnet new mvc -o ExampleProject --auth Individual
Run Code Online (Sandbox Code Playgroud)

您可以通过将 Startup.cs 中的以下方法修改为如下所示来获得对身份验证过程的完全控制:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<IdentityUser, IdentityRole>()
        // services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
        .AddRazorPagesOptions(options =>
        {
            options.AllowAreas = true;
            options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
            options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
        });

    services.ConfigureApplicationCookie(options =>
    {
        options.LoginPath = $"/Identity/Account/Login";
        options.LogoutPath = $"/Identity/Account/Logout";
        options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
    });

    // using Microsoft.AspNetCore.Identity.UI.Services;
    services.AddSingleton<IEmailSender, EmailSender>();
}
Run Code Online (Sandbox Code Playgroud)

参考: https://learn.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity? view=aspnetcore-2.2&tabs=visual-studio#full

我个人对身份验证的偏好是 IdentityServer4 的混合流程,它为您提供了使用单点登录配置多个应用程序的范围。