Вернуть представление входа в систему вместо перенаправления в приложении MVC 2 (для всего сайта) - PullRequest
1 голос
/ 12 июля 2010

У меня есть приложение 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 голосов
/ 12 июля 2010

Я не уверен, что должен ответить на свой вопрос, но я хотел опубликовать решение, вдохновленное Саймоном Хазелтоном.

Мой класс 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>
<% } %>

Единственное, что я хотел бы сделать лучше, это не делать исходную ситуацию перенаправления при неудачном входе (так какна самом деле просто отправка в нормальный метод)

0 голосов
/ 12 июля 2010

Не могли бы вы сделать что-то в базовом контроллере, как

if(!User.Identity.IsInRole("Role1", "Role2")
{ 
    return View("Logon")
}
return;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...