我使用基于角色的授权,它工作正常,但对于一个控制器,我想要一个控制器的默认重定向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?
答案 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;
}