Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一个控制器的基于角色的授权重定向URL_C#_Redirect_Asp.net Core_.net Core - Fatal编程技术网

C# 一个控制器的基于角色的授权重定向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

我使用基于角色的授权,它工作得很好,但是对于一个控制器,我需要一个不同于一个控制器默认重定向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 core,因为在.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;
}