Имея разные страницы входа для разных областей ASP.NET MVC 3
Могу ли я иметь другой URL-адрес для входа в разные области ASP.NET MVC3?
например. Я хотел бы иметь другую страницу входа для администраторов и операторов ввода данных.
Я вижу web.config в каждой части области просмотра, и я попытался сделать:
<authentication mode="Forms">
<forms loginUrl="~/Administration/Account/LogOn" timeout="2880" />
</authentication>
но он не играет хорошо.
Приветствия.
Ответы
Ответ 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) для перенаправления, потому что текущий фильтр будет перенаправлен сразу на страницу входа в систему, иначе будет вызвано исходное действие и только затем перенаправлено на страницу входа.