在ASP中未经授权时重定向到登录.净的核心



. NET MVC中,如果用户没有经过身份验证,有一个重定向到登录操作的选项。

我需要同样的事情与ASP。. NET Core,所以I:

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

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

该选项在哪里/如何设置?

在当前的asp.net核心版本(2.1.0)中,这已经改变了,现在您可以使用扩展名:

   services.ConfigureApplicationCookie(options => options.LoginPath = "/login");

 services
         .AddAuthentication()
         .AddCookie(options =>
         {
             options.LoginPath = "/login";
             options.LogoutPath = "/logout";
         });

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

重定向在我的应用程序中根本不起作用,这里没有解决方案修复它,但使用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(...        

可以使用CookieAuthenticationOptions类配置路径

就像这样。

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

这是CookieAuthenticationHandler的更新链接

感兴趣的人也可以通过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();

如下所示:https://stackoverflow.com/a/41643105/5784635

我在2017年4月尝试过这个,"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.1.0"没有重定向,我不得不使用1.0.1版本

这个代码块在启动文件中为我工作在。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;
    });

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

dotnet new mvc -o ExampleProject --auth Individual

通过修改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>();
}

参考:https://learn.microsoft.com/en - us/aspnet/core/security/authentication/scaffold identity?view=aspnetcore - 2.2 -, = visual studio #标签完整的

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

放置在配置中间件管道中应该很重要。

app.UseSession();
        app.UseAuthentication();
        app.UseStatusCodePages(context => {
            var response = context.HttpContext.Response;
            if (response.StatusCode == (int)HttpStatusCode.Unauthorized ||
                response.StatusCode == (int)HttpStatusCode.Forbidden)
                response.Redirect("/Login");
            return Task.CompletedTask;
        });
        app.UseClaimsMiddleware();
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Login}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });

上面的代码工作得很好,我使用asp . net core 3.1身份验证

    首先,您必须将以下代码添加到Startup.cs文件
services.ConfigureApplicationCookie(options =>
{
     options.Cookie.Name = ".AspNetCore.Identity.Application";
     options.AccessDeniedPath = "/User/PageNotAllowed";               
});
  • 在控制器中创建一个动作,负责管理用户帐户(在我的情况下是user类)
  • public IActionResult PageNotAllowed()
    {
        return View();
    }
    
  • 最后一步,你只需要创建PageNotAllowed视图在你自己的口味。
  • 应用程序知道登录页面在哪里的原因是默认的" login "页面应该放在"Account"文件夹和页面应该命名为"login";比如"Account/Login"

    所以,如果你改变了"Account"文件夹到其他文件夹,比如"AccountFolder"然后你会得到一个HTTP 404页面,表示没有找到。

    要显式指定登录页面的位置,请转到"Program.cs"文件添加以下"loginpath";观念。

    builder.Services.AddAuthentication().AddCookie("YourCookieName", options =>
    {
        options.Cookie.Name = "YourCookieName";
        options.LoginPath = "/Account/Login";
    });
    
    上面的例子来自。net 6

    相关内容

    • 没有找到相关文章

    最新更新