c# - ASP.NET MVC - 如何在登录页面上显示未经授权的错误?

标签 c# .net asp.net asp.net-mvc authorization

在我的 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/

相关文章:

c# - 在WPF中使用System.Drawing.Color设置背景和前景

c# - 将多个参数传递给 client.PostAsJsonAsync 函数

c# - 将超链接添加到 Excel 工作表 closedxml

c# - 如何在 C# 中追加 xml 文件?

c# - 如何将类序列化为字符串?

c# - 如何使用 System.IO.DirectoryInfo 访问映射的网络驱动器?

javascript - 握手期间 ASP.NET Core WebSocket 失败

c# - 通过IP地址选择域 Controller C#

c# - 使用电子表格工具打开 protected 工作簿

c# - XmlWriter.WriteCData 引发 ArgumentException - 无效字符