在我的 ASP.NET MVC 应用程序中,我的大多数 Controller 都装饰有
[Authorize(Roles="SomeGroup")]
当用户无权访问某些内容时,他们将被发送到“~/Login”,这是我的帐户 Controller 上的登录操作。
我如何确定用户由于未获得授权而已到达登录页面,以便我可以显示适当的错误?
最佳答案
更新(2015 年 6 月):@daniel-lidström 已正确指出您不应在 ASP.NET MVC 应用程序中使用 Response.Redirect。有关原因的更多信息,请参阅此链接:Response.Redirect and ASP.NET MVC – Do Not Mix .
更新(2014 年 9 月):我不确定何时将 HandleUnauthorizedRequest 添加到 AuthorizeAttribute,但无论哪种方式,我都能够将 AuthorizeRedirect 代码细化为更小更简单的代码。 p>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuthorizeRedirect : AuthorizeAttribute
{
public string RedirectUrl = "~/Error/Unauthorized";
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
base.HandleUnauthorizedRequest(filterContext);
if (filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Result = new RedirectResult(RedirectUrl);
}
}
}
下面的原始答案(仍然功能齐全)
我在这里留下了这个答案,因为它仍然可以让您深入了解授权管道的工作原理。
对于仍然登陆这里的任何人,我已经编辑了 Ben Scheirman 的答案,以便在用户登录但未授权时自动重定向到未经授权的页面。您可以使用名称参数 RedirectUrl 更改重定向路径。
编辑:感谢 Tarynn 的建议,我已将解决方案设为线程安全的和 MSDN
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuthorizeRedirect : AuthorizeAttribute
{
private const string IS_AUTHORIZED = "isAuthorized";
public string RedirectUrl = "~/error/unauthorized";
protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
{
bool isAuthorized = base.AuthorizeCore(httpContext);
httpContext.Items.Add(IS_AUTHORIZED, isAuthorized);
return isAuthorized;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
var isAuthorized = filterContext.HttpContext.Items[IS_AUTHORIZED] != null
? Convert.ToBoolean(filterContext.HttpContext.Items[IS_AUTHORIZED])
: false;
if (!isAuthorized && filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.RequestContext.HttpContext.Response.Redirect(RedirectUrl);
}
}
}
关于c# - ASP.NET MVC - 如何在登录页面上显示未经授权的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1498727/