. NET MVC中,如果用户没有经过身份验证,有一个重定向到登录操作的选项。
我需要同样的事情与ASP。. NET Core,所以I:
- 创建了一个ASP。. NET Core项目从Visual Studio模板
- 添加
[Authorize]
到任意动作 - 在浏览器中打开相应的视图
我不期望重定向,因为我没有配置它。但是,它会自动重定向到登录操作!
该选项在哪里/如何设置?
在当前的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类)
- 最后一步,你只需要创建
PageNotAllowed
视图在你自己的口味。
public IActionResult PageNotAllowed()
{
return View();
}
应用程序知道登录页面在哪里的原因是默认的" 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