ASP.NET 核心,将默认重定向更改为“未经授权”



我正在尝试重定向到 ASP.NET MVC6 中的其他登录网址

我的帐户控制器登录方法具有用于更改 URL 的 Route 属性。

[HttpGet]
[AllowAnonymous]
[Route("login")]
public IActionResult Login(string returnUrl = null)
{
    this.ViewData["ReturnUrl"] = returnUrl;
    return this.View();
}

当尝试访问未授权的页面时,我被重定向到无效的 url,它应该只是/login但相反,我得到了 http://localhost/Account/Login?ReturnUrl=%2Fhome%2Findex

我已经配置了 cookie 身份验证路径,如下所示:

services.Configure<CookieAuthenticationOptions>(opt =>
{
    opt.LoginPath = new PathString("/login");
});

我添加了一个默认过滤器,以确保默认情况下所有 url 都需要身份验证。

services.AddMvc(
    options =>
    {
        options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));
    });

我已经检查了 url /login实际上确实加载了登录页面,而/account/login没有,正如预期的那样。

编辑:我已经按原样保留了路由(除了更改默认控制器和操作(

app.UseMvc(routes =>
{
    routes.MapRoute(
      name: "default",
      template: "{controller=Site}/{action=Site}/{id?}");
});

现在asp.net core 2.0出来了,这已经变成了:

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

有关迁移到 2.0 的更多信息,请单击此处。以及有关从 2.0 迁移到 2.1 的更多信息。

更新最新 Asp.NET 7.0,感谢@Chekkan:

services.AddAuthentication().AddCookie(options => options.LoginPath = "/Login"); 
如果您

在此处检查UseIdentity扩展方法,您会注意到它使用的是IdentityOptions而不是CookieAuthenticationOptions,因此您必须配置IdentityOptions

services.Configure<IdentityOptions>(opt =>
{
    opt.Cookies.ApplicationCookie.LoginPath = new PathString("/login");
});

编辑

对于 asp.net 核心 2.0:身份 Cookie 选项不再是身份选项的一部分。检查 mxmissile 的答案。

asp.net core 2.0以来,如果您使用没有身份的cookie:

app.UseAuthentication();
// If you don't want the cookie to be automatically authenticated and assigned HttpContext.User, 
// remove the CookieAuthenticationDefaults.AuthenticationScheme parameter passed to AddAuthentication.
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options => 
    {
        options.LoginPath = "/Account/LogIn";
        options.LogoutPath = "/Account/LogOff";
    });

您可能还想尝试使用StatusCodePages

app.UseStatusCodePages(async contextAccessor => 
{
    var response = contextAccessor.HttpContext.Response;
    if (response.StatusCode == (int)HttpStatusCode.Unauthorized || 
        response.StatusCode == (int)HttpStatusCode.Forbidden)
    {
        response.Redirect("/Error/Unauthorized");
    }
});

添加身份验证服务时.cs您需要在启动时配置此功能,尤其是在使用 cookie 身份验证方案时。

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options => 
        {
            options.LoginPath = new PathString("/login");
        }); 

这就是我解决问题的方式,您应该尝试一下...它肯定会为你工作

更新

:从 dot net core 2.1.x 开始,标识是从 SDK 中移除的。要共同签署@mxmissile答案,可以指定路径。 要实现技巧路径,请与高级路由或重定向结合使用。脚手架身份

我不推荐在现实生活中使用Serj Sagan解决方案。这在开发时可以完美运行,但对于不同类型的用户使用的实际应用程序,这可能会产生误导。让我们看一下下面的场景

  1. 我已通过身份验证使用
  2. 我知道特定页面的网址
  3. 我无权访问该页面

这意味着我将被重定向到登录页面,就好像我没有经过身份验证一样,但事实并非如此。我会更多地使用 mxmissile 解决方案

我正在使用AddMvcCore,但是如果您使用的是剃刀视图,则需要添加AddRazorViewEngine,如果您使用的是剃刀页面,则需要添加AddRazorPages

        services.AddMvcCore(options =>
        {
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        })
        .AddRazorViewEngine()
        .AddAuthorization()
        .AddJsonFormatters();

相关内容

  • 没有找到相关文章

最新更新