【问题标题】:Role based authorization redirect URL for one controller一个控制器的基于角色的授权重定向 URL
【发布时间】:2017-11-24 01:59:22
【问题描述】:

我正在使用基于角色的授权,它工作正常,但对于一个控制器,我想要一个与一个控制器的默认重定向 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 的示例,它解释了如何执行 it,但该示例不适用于 .net core,因为在 .net core 中,方法 HandleUnauthorizedRequest 不能被覆盖(它不存在于 .网核AuthorizeAttribute)。

使用基于角色的授权时,如何在 .net 核心中为特定控制器设置自定义重定向 URL?

【问题讨论】:

    标签: c# redirect asp.net-core .net-core


    【解决方案1】:

    根据this 的讨论,授权重定向由身份验证中间件处理。

    例如,如果使用 cookie 身份验证,您可以覆盖 CookieAuthenticationEvents.OnRedirectToAccessDenied 方法以根据请求 URL 设置自定义重定向 URL:

    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        Events = new CookieAuthenticationEvents
        {
            OnRedirectToAccessDenied = RedirectToAccessDenied,
            OnRedirectToLogin = ...
            OnRedirectToLogout = ...
            OnRedirectToReturnUrl = ...
        }
    });
    

    实现(检查CookieAuthenticationOptions source code 为默认):

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-24
      • 2020-06-22
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 2019-01-25
      • 2022-08-18
      相关资源
      最近更新 更多