一个控制器的基于角色的授权重定向 URL



我使用基于角色的授权,它工作正常,但对于一个控制器,我想要一个不同于一个控制器的默认重定向 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;
}

最新更新