在`AuthorizeAttribute`重定向时在登录页面中显示自定义消息

时间:2012-07-25 04:18:11

标签: asp.net-mvc-3 httpcontext authorize-attribute

我已经编写了一个自定义AuthorizeAttribute来在登录页面中显示消息。这是代码。

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    public string Message { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        bool authorized = base.AuthorizeCore(httpContext);
        if (!authorized)
        {
            httpContext.Items["LoginFailMessage"] = Message;
        }

        return authorized;
    }
}

在我的行动中,我会做

[MyAuthorize(Message = "Please login to continue")]
public ActionResult Detail() 

现在,我无法访问视图中的HttpContext.Current.Items["LoginFailMessage"]项。我意识到问题是,该项只存在于一个重定向调用,但授权失败导致多个重定向。

那么,有什么办法可以解决这个问题吗?我应该从哪里传递消息?

修改

我想要做的是,假设匿名用户可以看到某些内容的简短描述。

根据说明,有一个edit和一个detail链接。 editdetail都要求用户登录。因此,如果点击,用户将被重定向到登录页面。

如果用户点击edit,我会在登录页面中显示消息Please login to edit以及点击detail可能是please login to see detail

1 个答案:

答案 0 :(得分:0)

使用ModelState执行此操作会更容易,例如:

[HttpPost]
public ActionResult Login(LoginViewModel model) {
    // .. check model state is valid
    if (AuthorizationService.Authorize(model.Username, model.Password)) {
        // .. user is authenticated
    }
    else {
        ModelState.AddModelError("", "Login failed.");
        return View(model);
    }
}

然后,您可以使用ValidationSummary()在登录页面上显示错误,或者在AddModelError调用中传递用户名或密码模型属性的名称以使用ValidationMessage()。