我已经编写了一个自定义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
。
答案 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()。