Подтвердить что ты не робот

Имея разные страницы входа для разных областей ASP.NET MVC 3

Могу ли я иметь другой URL-адрес для входа в разные области ASP.NET MVC3?

например. Я хотел бы иметь другую страницу входа для администраторов и операторов ввода данных.

Я вижу web.config в каждой части области просмотра, и я попытался сделать:

<authentication mode="Forms">
    <forms loginUrl="~/Administration/Account/LogOn" timeout="2880" />
</authentication>

но он не играет хорошо.

Приветствия.

4b9b3361

Ответ 1

Я не знаю, как .NET обрабатывает это для вас, но вы можете создать пользовательский AuthorizationAttribute

public class CustomAuthorization : AuthorizeAttribute {

  public string Url { get; set; }

  public override void OnAuthorization(AuthorizationContext filterContext) {

    if (!filterContext.HttpContext.User.Identity.IsAuthenticated) {
      filterContext.HttpContext.Response.Redirect(Url);
    }
    base.OnAuthorization(filterContext);

  }

}

Добавьте это к вашим контроллерам/действиям

[CustomAuthorization(Url="/Area/Login")]
public class HomeController {
  //...
}

Ответ 2

Мое решение было основано на решении, представленном Дэвидом Гленном, спасибо.

public class CustomAuthorization : AuthorizeAttribute
{
    public string Url { get; set; }

    // redirect to login page with the original url as parameter.
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectResult(Url + "?returnUrl=" + filterContext.HttpContext.Request.Url.PathAndQuery);
    }
}

И добавьте атрибут к вашим контроллерам/действиям

[CustomAuthorization(Url="/Area/Login")]
public class HomeController {
  //...
}

Лучше использовать filterContext.Result, чем filterContext.HttpContext.Response.Redirect(Url) для перенаправления, потому что текущий фильтр будет перенаправлен сразу на страницу входа в систему, иначе будет вызвано исходное действие и только затем перенаправлено на страницу входа.