我使用基于角色的授权,它工作正常,但对于一个控制器,我想要一个不同于一个控制器的默认重定向 url。我当前的代码:
[Authorize(Roles = nameof(EIdentityType.Support))]
[Route("[controller]")]
public class AdminController : Controller
{
//CLASS METHODS
}
这会将用户重定向到
/Account/Login?ReturnUrl=%2Fadmin
但是,我希望将用户(针对此特定控制器,而不是其他控制器(重定向到
/admin/login
我找到了 asp.net mvc-4 的示例,它解释了如何做到这一点,但该示例不适用于 .net 核心,因为在 .net core 中HandleUnauthorizedRequest
无法覆盖该方法(它不存在在 .net core AuthorizeAttribute
中(。
使用基于角色的授权时,如何为 .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;
}