ASP.NET核心,更改未经授权的默认重定向

rvpgvaaj  于 2023-03-20  发布在  .NET
关注(0)|答案(7)|浏览(173)

我正在尝试重定向到ASP.NET MVC6中的其他登录URL
我的帐户控制器登录方法有一个Route属性来更改url。

[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");
});

我已经添加了一个默认过滤器,以确保所有的网址都需要身份验证。

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?}");
});
0wi1tuuw

0wi1tuuw1#

现在asp.net core 2.0退出后,此选项已更改为:

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

更多关于migrating to 2.0 here的信息,以及更多关于从2.0迁移到2.1的信息。
更新最新的Asp.NET 7.0,感谢@Chekkan:

services.AddAuthentication().AddCookie(options => options.LoginPath = "/Login");
z4bn682m

z4bn682m2#

如果选中UseIdentity扩展方法here,您会注意到它使用的是IdentityOptions而不是CookieAuthenticationOptions,因此您必须配置IdentityOptions

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

编辑

对于asp.netcore 2.0:身份cookie选项不再是身份选项的一部分。

laik7k3q

laik7k3q3#

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";
    });

source

7eumitmz

7eumitmz4#

您可能还想尝试使用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");
    }
});
tuwxkamq

tuwxkamq5#

在添加身份验证服务时,特别是在使用cookie身份验证方案时,需要在startup.cs中进行配置。

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

这就是我解决问题的方法,你应该试试......它肯定对你有用

z9smfwbn

z9smfwbn6#

更新:从dot net core 2.1.x开始,Identity是从SDK中搭建的。要共同签署@mxmissile应答,可以指定路径。要使用技巧路径,请合并高级路由或重定向。

s6fujrry

s6fujrry7#

我不会推荐Serj Sagan解决方案在真实的生活中的例子。这将是完美的工作时,开发,但对于一个真正的应用程序所使用的不同类型的用户可能会误导。让我们看看下面的场景
1.我已通过身份验证
1.我知道特定页面的URL
1.我无权访问该页面
这意味着我会被重定向到登录页面,就好像我没有通过身份验证一样,事实并非如此。我会更多地使用mxmissile解决方案
我个人使用AddMvcCore,但如果使用的是剃刀视图,则需要添加AddRazorViewEngine;如果使用的是剃刀页面,则需要添加AddRazorPages

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

相关问题