ASP.Net核心MVC6未经授权重定向到登录

我正在使用ASP.Net核心MVC 6,我试图让用户重定向到登录页面,如果他们没有经过身份validation。

我似乎无法让它工作,目前用户只是得到一个空白页面。

下面是我在Startup.cs中的ConfigureServices方法

public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")) ); services.AddIdentity(options => { // configure identity options options.Password.RequireDigit = true; options.Password.RequireLowercase = true; options.Password.RequireUppercase = true; options.Password.RequireNonAlphanumeric = true; options.Password.RequiredLength = 7; options.Cookies.ApplicationCookie.AutomaticAuthenticate = true; options.Cookies.ApplicationCookie.AutomaticChallenge = true; options.Cookies.ApplicationCookie.LoginPath = "/Account/Login"; // User settings options.User.RequireUniqueEmail = true; }) .AddEntityFrameworkStores() .AddDefaultTokenProviders(); services.AddMvc(); // Add application services. services.AddTransient(); services.AddTransient(); } 

我本人正在努力解决这个问题,我得出的结论是,最新版本的“Microsoft.AspNetCore.Identity.EntityFrameworkCore”依赖关系似乎存在问题

我最初使用的是1.1.0版本,但经过大量调试,中间件日志记录等,我得出的结论是我没有做错任何事。 我检查了:

  • 授权属性工作并阻止请求
  • 添加了事件处理程序(OnRedirectToLogin),如下所示,以validation重定向URL(这仅用于调试)

     options.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents { OnRedirectToLogin = evt => { evt.Response.Redirect(evt.RedirectUri); // this url is correct, but the redirect never happens!?? return Task.FromResult(0); } }; 

解决方案 :我将我的软件包回滚到版本1.0.1,然后重定向按预期启动 – 到LoginPath设置中的Startup.cs中定义的URL

 options.Cookies.ApplicationCookie.LoginPath = new PathString("/Auth/Login"); 

为了澄清,这个版本有效:Microsoft.AspNetCore.Identity.EntityFrameworkCore“:”1.0.1“

我将向ASPNETCORE团队提出一个关于1.1.0版本的调查问题。

同样的问题在这里 解决此问题时快速解决问题:

 public class LogInRequiredFilter : IAuthorizationFilter { public void OnAuthorization(AuthorizationFilterContext context) { if (!AttributeManager.HasAttribute(context, typeof(LogInRequired))) return; if (context.HttpContext.User.Identity.IsAuthenticated) return; context.Result = new RedirectResult("/login?ReturnUrl=" + Uri.EscapeDataString(context.HttpContext.Request.Path)); } } public class LogInRequired : Attribute { public LogInRequired() { } } 

然后在你的控制器中:

  [HttpGet, LogInRequired] public IActionResult return View(); } 

这会将您重定向到您的登录页面,然后它会将您重定向到您想要访问的原始页面。

属性管理器代码:

 public static Boolean HasAttribute(AuthorizationFilterContext context, Type targetAttribute) { var hasAttribute = false; var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; if (controllerActionDescriptor != null) { hasAttribute = controllerActionDescriptor .MethodInfo .GetCustomAttributes(targetAttribute, false).Any(); } return hasAttribute; } 

好的,从Asp.Net Core 2.1开始。 为了将用户重定向到登录页面。 这是您在ConfigureServices(IserviceCollection services)方法中需要做的。

 services.ConfigureApplicationCookie(options => { options.LoginPath = "/Identity/Account/Login"; options.SlidingExpiration = true; }); 

有关更多信息,请访问Microsoft身份文档。 https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-configuration?view=aspnetcore-2.1#cookie-settings