2017-06-21 123 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; 
}