C# 是否可以更改AccessDeniedPath上的查询字符串参数?

C# 是否可以更改AccessDeniedPath上的查询字符串参数?,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,在ASP.NET Core 3.1 web应用程序中,我可以在我的Startup.cs中更改未经授权请求的目标路由,如下所示: services.ConfigureApplicationCookie(o => { o.AccessDeniedPath = "/Home/Error"; }); 这将返回/Home/Error?ReturnUrl=…其中…是我试图访问的任何页面 但实际上我只想让它简单地返回“/Home/Error?code=401” 我试过了 o

在ASP.NET Core 3.1 web应用程序中,我可以在我的
Startup.cs
中更改未经授权请求的目标路由,如下所示:

services.ConfigureApplicationCookie(o =>
{
    o.AccessDeniedPath = "/Home/Error";
});
这将返回
/Home/Error?ReturnUrl=…
其中
是我试图访问的任何页面

但实际上我只想让它简单地返回“/Home/Error?code=401”

我试过了

o.AccessDeniedPath = "/Home/Error?code=401"
但这只会带来简单的回报

"/Home/Error?code=401?ReturnUrl=%2FAdmin"
然后我意识到选项中有一个
ReturnUrlParameter
,如下所示:

o.ReturnUrlParameter = "code";
o.AccessDeniedPath = "/Home/Error";
这让我在重定向中走了这么远:

/Home/Error?code=%2FAdmin
但是我想指定keyvalue(例如401),即替换请求来自的页面,因此最终结果将是

/Home/Error?code=401

根据您的代码,您似乎正在使用cookie身份验证,我建议您可以尝试使用更改重定向URL,检查以下示例代码:

        services.AddAuthentication("CookieAuthentication")
            .AddCookie("CookieAuthentication", config =>
            {
                config.Cookie.Name = "UserLoginCookie"; // Name of cookie     
                config.LoginPath = "/Login/UserLogin"; // Path for the redirect to user login page    
                config.AccessDeniedPath = "/Login/UserAccessDenied";
                config.Events = new Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationEvents()
                {
                    OnRedirectToAccessDenied = ctx =>
                    {
                        var redirectPath = ctx.RedirectUri;
                        if (redirectPath.Contains("?ReturnUrl"))
                        {
                            //remove the ReturnURL
                            var url = redirectPath.Substring(0, redirectPath.LastIndexOf("?ReturnUrl"));

                            ctx.Response.Redirect(url + "?code=401");
                        }
                        // Or, directly using the following code:
                        //ctx.Response.Redirect("/Login/UserAccessDenied?code=401");
                        return Task.CompletedTask;
                    }
                };
            });
输出如下所示:

o.ReturnUrlParameter = "code";
o.AccessDeniedPath = "/Home/Error";

服务器上的角色可能有问题:@jdweng与我想要实现的目标无关。我的授权工作正常,我只想在用户未经授权时更改它重定向到的页面。该链接也适用于ASP.NET 3.5,而我使用的是ASP.NET Core 3.1,这似乎是一种默认行为,它的存在是有原因的。也许,若您不在服务器上使用它,就忽略它。如果您仍然希望删除它,可以尝试类似或的操作。可能这在没有自定义身份验证实现的情况下是无法实现的。实际上,我有一个自定义的身份验证例程正在运行,但我刚刚意识到我基本上可以检查
ReturnUrl
在我的
Home/Error
请求中是否为空,并在那里执行我需要的操作,因此现在不再需要更改它了。我正在根据我的应用程序设置使用Windows身份验证(我猜它使用cookies?),我没有在启动时添加任何其他身份验证,我只是在控制器上使用自定义的[Authorize]属性,但这将起作用,因为我仍在使用
服务。配置应用程序okie