返回登录视图,而不是重定向到MVC 2应用程序(站点范围)

时间:2010-07-12 00:23:26

标签: c# authentication asp.net-mvc-2

我有一个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
{

}

有没有办法真正让这项工作? (这是我的第一篇文章)

2 个答案:

答案 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>
<% } %>

我唯一希望它做得更好的是在登录失败时不做原始的重定向情况(因为这实际上只是发布到普通方法)