在我的ASP.NET MVC应用程序,我的大多数控制器都装饰有

[Authorize(Roles="SomeGroup")]

当用户未被授权访问某些内容时,他们将被发送到"~/Login",这是My Account控制器上的Login操作.

如何确定用户由于未经授权而进入登录页面,以便显示适当的错误?

推荐答案

您可以查找?ReturnUrl= querystring值,也可以创建自己的授权过滤器&;在TempData中设置一个字段,指明原因.

下面是一个简单的自定义过滤,它可以做到这一点:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class CustomAuthorizeAttribute : AuthorizeAttribute
{

    // NOTE: This is not thread safe, it is much better to store this
    // value in HttpContext.Items.  See Ben Cull's answer below for an example.
    private bool _isAuthorized;

    protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
    {
        _isAuthorized = base.AuthorizeCore(httpContext);
        return _isAuthorized;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if(!_isAuthorized)
        {
            filterContext.Controller.TempData.Add("RedirectReason", "Unauthorized");
        }
    }
}

在你看来,你可以这样做:

@if(TempData["RedirectReason"] == "Unauthorized")
{
    <b>You don't have permission to access that area</b>
}

(Though I'd recommend a better approach than these magic strings, but you get the point)

Asp.net相关问答推荐

如何在ASP.NET中执行具有快速端点的GET请求?

为什么 Web 架构应该是松耦合的?

您如何处理多个环境的多个 web.config 文件?

ReportViewer 控件 - 高度问题

Azure 自定义控制器/API .Net 后端

如何在 ASP.NET WebForms 中实现 TDD

ASP.NET Response.Redirect 使用 302 而不是 301

ASP.NET Membership:如何将用户设置为已登录

正在检索组件的 COM 类工厂......错误:80070005 访问被拒绝. (来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))

Jquery asp.net 按钮单击事件通过 ajax

从 JavaScript 读取 web.config

GridView 与嵌套类的属性绑定

如何将枚举类型绑定到 DropDownList?

跟踪点有什么用途?

MVC 4 - Razor - 将变量传递到 href url

HttpResponse.End 或 HttpResponse.Close 与 HttpResponse.SuppressContent

避免在 ASP.NET MVC 中使用会话状态是一种好习惯吗?如果是,为什么以及如何?

错误处理(向客户端发送 ex.Message)

DataTable 不包含 AsEnumerable 的定义

如何识别字符串是否包含 unicode 字符?