![](/img/trans.png)
[英]Redirect unauthorized users to custom login view [Asp.net Core 5]
[英]Redirect to login when unauthorized in ASP.NET Core
在之前的 ASP.NET MVC 中,如果用戶未通過身份驗證,則有一個重定向到登錄操作的選項。
我需要與 ASP.NET 核心相同的東西,所以我:
[Authorize]
到一些任意操作我不希望重定向,因為我還沒有配置它。 但是,它會自動重定向到登錄操作!
這個選項在哪里/如何設置?
在當前的 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 工作正常
services.ConfigureApplicationCookie(options =>
{
options.Cookie.Name = ".AspNetCore.Identity.Application";
options.AccessDeniedPath = "/User/PageNotAllowed";
});
public IActionResult PageNotAllowed()
{
return View();
}
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.