C# Authorize属性重定向到LoginPath,而不是AccessDeniedPath

C# Authorize属性重定向到LoginPath,而不是AccessDeniedPath,c#,asp.net,asp.net-mvc,asp.net-core,authorization,C#,Asp.net,Asp.net Mvc,Asp.net Core,Authorization,我具有应用程序cookie的以下配置: services.ConfigureApplicationCookie(options => { options.LoginPath = $"/Identity/LogIn"; options.LogoutPath = $"/Identity/LogOut"; options.AccessDeniedPath = $""; }); 以及以下授权策略: services.AddAuthorization(options =&g

我具有应用程序cookie的以下配置:

services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = $"/Identity/LogIn";
    options.LogoutPath = $"/Identity/LogOut";
    options.AccessDeniedPath = $"";
});
以及以下授权策略:

services.AddAuthorization(options =>
{
    options.AddPolicy("User", policy => policy.RequireClaim(ClaimTypes.Role, "User"));
    options.AddPolicy("Admin", policy => policy.RequireClaim(ClaimTypes.Role, "Admin"));
});
创建用户后,我添加以下策略:

await _userManager.AddClaimsAsync(user, new[] {new Claim(ClaimTypes.Role, "User")});
然后,我有一个带有authorize属性和Admin policy的伪操作,每当我试图使用一个只有“User”策略的帐户访问它时,我希望被重定向到AccessDeniedPath,因为我已经登录,每当我没有登录时,我希望被重定向到LoginPath,但是我总是被重定向到LoginPath

[Authorize(Policy = "Admin")]
[HttpGet]
public IActionResult Action()
{
    //..
}
简而言之,所需的行为是,每当用户试图访问资源而未登录时,我就会被重定向到
options.LoginPath=$”/Identity/LogIn“
,并被重定向到
options.AccessDeniedPath=$”每当用户登录但权限不足时


我打算将同样的想法不仅应用于控制器,也应用于razor页面。

Authorize
属性返回错误401,这通常会重定向到具有正确凭据的登录。我相信在处理错误403时会使用
AccessDeniedPath

我们最近实现了一个自定义授权属性,专门用于处理401和403错误的分离

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,Inherited=true,AllowMultiple=true)]
公共类CustomAuthorizeAttribute:System.Web.Mvc.AuthorizeAttribute
{
受保护的覆盖无效HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
{
//如果用户已通过身份验证,则发送403而不是401
if(filterContext.HttpContext.Request.IsAuthenticated)
{
filterContext.Result=new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);//403
}
其他的
{
//如果用户未通过身份验证,则抛出401
base.HandleUnauthorizedRequest(filterContext);/401
}
}        
}

您的意思是,即使用户已登录,当访问受保护的管理员控制器时,用户也将重定向到
/Identity/LogIn
?@NanYu是,这是当前的行为