我有一个MVC 2应用程序,每个页面都需要授权(目前除了/ Account / Logon),但我更愿意而不是转发到“/ Account / LogOn?ReturnUrl = / SomePage”来验证用户,它只会在用户请求的页面上显示登录表单,因此URL不会更改
我已经有了一个BaseController,几乎所有其他控制器都继承了我用于其他目的的地方,我已经把我的AuthorizeAttribute(为了简洁而改了):
[Authorize(Roles = "Role1, Role2")]
public class BaseController : Controller
{
}
我最初想要一个光滑的解决方案是以一种看起来像这样的方式覆盖AuthorizeAttribute类:
public class AuthorizeWithLoginAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
//This doesn't work obviously
filterContext.Result = View("Logon");
}
}
然后我可以简单地将上面的控制器更改为:
[AuthorizeWithLogin(Roles = "Role1, Role2")]
public class BaseController : Controller
{
}
有没有办法真正让这项工作? (这是我的第一篇文章)
答案 0 :(得分:0)
你能在像
这样的基础控制器中做点什么吗?if(!User.Identity.IsInRole("Role1", "Role2")
{
return View("Logon")
}
return;
答案 1 :(得分:0)
我不确定我是否应该回答我自己的问题,但我想发布Simon Hazelton启发的解决方案。
我的BaseController类(为了简洁而再次修改):
[Authorize(Roles = "Role1, Role2")]
public class BaseController : Controller
{
protected override void OnAuthorization(AuthorizationContext filterContext)
{
if (!User.IsInRole("Role1") && !User.IsInRole("Role2"))
{
filterContext.Result = View("LogonView");
}
base.OnAuthorization(filterContext);
}
}
视图中的表单/Views/Shared/LogonView.aspx:
(这是从默认的/Views/Accounts/LogOn.aspx中复制的,并修改了Html.BeingForm())
<% using (Html.BeginForm(new { action = "LogOn", controller = "Account", area = "", returnUrl = Request.Url.PathAndQuery }))
<%: Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.") %>
<div>
<fieldset>
<legend>Account Information</legend>
<div class="editor-label">
<%: Html.LabelFor(m => m.UserName) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(m => m.UserName) %>
<%: Html.ValidationMessageFor(m => m.UserName) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(m => m.Password) %>
</div>
<div class="editor-field">
<%: Html.PasswordFor(m => m.Password) %>
<%: Html.ValidationMessageFor(m => m.Password) %>
</div>
<div class="editor-label">
<%: Html.CheckBoxFor(m => m.RememberMe) %>
<%: Html.LabelFor(m => m.RememberMe) %>
</div>
<p>
<input type="submit" value="Log On" />
</p>
</fieldset>
</div>
<% } %>
我唯一希望它做得更好的是在登录失败时不做原始的重定向情况(因为这实际上只是发布到普通方法)