簡體   English   中英

在 ASP.NET 核心中未經授權時重定向到登錄

[英]Redirect to login when unauthorized in ASP.NET Core

在之前的 ASP.NET MVC 中,如果用戶未通過身份驗證,則有一個重定向到登錄操作的選項。

我需要與 ASP.NET 核心相同的東西,所以我:

  1. 從 Visual Studio 模板創建了一個 ASP.NET Core 項目
  2. 添加[Authorize]到一些任意操作
  3. 在我的瀏覽器中打開相應的視圖

我不希望重定向,因為我還沒有配置它。 但是,它會自動重定向到登錄操作!

這個選項在哪里/如何設置?

在當前的 aspnet 核心版本 (2.1.0) 中,這已經發生了變化,現在您可以使用擴展:

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

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

您可以在本文中了解有關遷移到 2.0 的更多信息。

您可以使用CookieAuthenticationOptions類配置路徑。

像這樣的東西。

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

重定向在我的應用程序中根本不起作用,這里的解決方案都沒有修復它,但是使用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(...        

對於任何感興趣的人,也可以通過 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版本

dotnet 核心支架 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 : //docs.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-2.2&tabs=visual-studio#full

我個人對身份驗證的偏好是 IdentityServer4 的混合流程,它為您提供了使用單點登錄配置多個應用程序的范圍。

啟動文件中的此代碼塊適用於 .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;
    });

放置在配置中間件管道中應該很重要。

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 中使用 Identity Authentication 工作正常

  1. 首先,您必須將以下代碼添加到您的 Startup.cs 文件中
services.ConfigureApplicationCookie(options =>
{
     options.Cookie.Name = ".AspNetCore.Identity.Application";
     options.AccessDeniedPath = "/User/PageNotAllowed";               
});
  1. 在您的 Controller 中創建一個負責管理用戶帳戶的操作(在我的例子中是用戶類)
public IActionResult PageNotAllowed()
{
    return View();
}
  1. 最后一步,您只需要根據自己的喜好創建PageNotAllowed視圖。

應用程序知道登錄頁面在哪里的原因是因為默認情況下“登錄”頁面應該放在“帳戶”文件夾中,頁面應該被稱為“登錄”,比如“帳戶/登錄”

因此,如果您將“帳戶”文件夾更改為“AccountFolder”之類的其他文件夾,那么您將收到 http 404 頁面未找到。

要明確指定登錄頁面 go 到“Program.cs”文件的位置,請添加以下“LoginPath”定義。

builder.Services.AddAuthentication().AddCookie("YourCookieName", options =>
{
    options.Cookie.Name = "YourCookieName";
    options.LoginPath = "/Account/Login";
});

以上例子來自.NET 6

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM