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

时间:2017-06-21 09:00:21

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

我使用基于角色的授权,它工作正常,但对于一个控制器,我想要一个控制器的默认重定向URL。我目前的代码:

 a<-2
 b<-2 
 u<-0.15
 alpha<-0.8

integrand<-function(x) {
   (exp(x)+1)^(1i * u)*cos((x-alpha)*u)
 }

 myintegrate(integrand,lower=a,upper = b)

这会将用户重定向到

[Authorize(Roles = nameof(EIdentityType.Support))]
[Route("[controller]")]
public class AdminController : Controller
{
      //CLASS METHODS
}

但是我希望用户(对于这个特定的控制器,而不是其他控制器)被重定向到

/Account/Login?ReturnUrl=%2Fadmin

我找到了asp.net mvc-4的示例,它解释了如何做it,但该示例不适用于.net核心,因为在.net核心中,方法/admin/login 无法覆盖(它确实在.net core HandleUnauthorizedRequest)中不存在。

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

1 个答案:

答案 0 :(得分: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;
}