2017-06-21 126 views
2

即时通讯使用基于角色的授权,它工作正常,但对于一个控制器我想要一个控制器的默认值不同的重定向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核心,因为在.net核心中,方法HandleUnauthorizedRequest不能结束(它不存在于.net核心AuthorizeAttribute)。

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

回答

1

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

例如,如果cookie认证使用,你可以重写CookieAuthenticationEvents.OnRedirectToAccessDenied方法来设置自定义根据请求的URL重定向URL:

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

实施(检查CookieAuthenticationOptionssource 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; 
}