C# 一个控制器的基于角色的授权重定向URL
我使用基于角色的授权,它工作得很好,但是对于一个控制器,我需要一个不同于一个控制器默认重定向url的重定向url。我当前的代码:C# 一个控制器的基于角色的授权重定向URL,c#,redirect,asp.net-core,.net-core,C#,Redirect,Asp.net Core,.net Core,我使用基于角色的授权,它工作得很好,但是对于一个控制器,我需要一个不同于一个控制器默认重定向url的重定向url。我当前的代码: [Authorize(Roles = nameof(EIdentityType.Support))] [Route("[controller]")] public class AdminController : Controller { //CLASS METHODS } 这会将用户重定向到 /Account/Login?ReturnUrl=%2Fadm
[Authorize(Roles = nameof(EIdentityType.Support))]
[Route("[controller]")]
public class AdminController : Controller
{
//CLASS METHODS
}
这会将用户重定向到
/Account/Login?ReturnUrl=%2Fadmin
但是,我希望将用户(对于此特定控制器,而不是其他控制器)重定向到
/admin/login
我找到了asp.net mvc-4的示例,其中解释了如何操作,但该示例不适用于.net core,因为在.net core中,无法覆盖方法HandleUnauthorizedRequest
(它在.net coreAuthorizeAttribute
中不存在)
使用基于角色的授权时,如何为.net core中的特定控制器设置自定义重定向URL?根据讨论,授权重定向由身份验证中间件处理
例如,如果使用cookie身份验证,您可以覆盖CookieAuthenticationEvents.OnRedirectToAccessDenied
方法以根据请求URL设置自定义重定向URL:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
Events = new CookieAuthenticationEvents
{
OnRedirectToAccessDenied = RedirectToAccessDenied,
OnRedirectToLogin = ...
OnRedirectToLogout = ...
OnRedirectToReturnUrl = ...
}
});
实现(检查默认选项的CookieAuthenticationOptions):
private async Task RedirectToAccessDenied(CookieRedirectContext context)
{
if (IsAjaxRequest(context.Request))
{
//default path
context.Response.Headers["Location"] = context.RedirectUri;
context.Response.StatusCode = 403;
}
else if (context.Request.Path.Value.Equals("/Foo/Bar"))
{
//custom
context.Response.Redirect("http://google.com");
}
else
{
//default path
context.Response.Redirect(context.RedirectUri);
}
}
private static bool IsAjaxRequest(HttpRequest request)
{
if (!string.Equals(request.Query["X-Requested-With"], "XMLHttpRequest", StringComparison.Ordinal))
return string.Equals(request.Headers["X-Requested-With"], "XMLHttpRequest", StringComparison.Ordinal);
return true;
}