0

我已经编写了一个自定义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链接。两者都edit需要detail用户登录。因此,如果单击其中一个,用户将被重定向到登录页面。

如果用户点击edit我将显示一条消息Please login to edit,如果点击detail可能please login to see detail在登录页面中。

4

1 回答 1

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()。

于 2012-07-25T04:34:59.167 回答