Страницы входа в несколько форм - PullRequest
2 голосов
/ 17 января 2012

У меня есть сайт MVC3 с сайтом администратора и общедоступным сайтом. Контроллеры, представления, модели и т. Д. Для них находятся в одном и том же проекте MVC. Они разделены следующим образом: сайт администратора находится в области MVC3, называемой администратором, а общедоступный сайт не принадлежит области, но существует на верхнем уровне. Сайт администратора имеет вид входа в систему, а общедоступный сайт также имеет вид входа в систему. В моем файле web.config у меня есть:

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

Теперь, если я получу доступ к какой-либо странице на общедоступном сайте, требующей аутентификации, я попаду на страницу входа на общедоступном сайте, и это здорово. Однако, если я получаю доступ к какой-либо странице в Административной области, требующей аутентификации, я снова попадаю на страницу входа на общедоступном сайте. Тогда возникает вопрос: как мне убедиться, что, если я нахожусь на странице в Административной области, требующей аутентификации, меня отправляют на страницу входа администратора?

Ответы [ 3 ]

7 голосов
/ 17 января 2012

Я столкнулся с подобной проблемой, когда мне нужно было иметь локализованную страницу входа. Я создаю собственный атрибут Authorize:

public class CustomAuthorize : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        if (filterContext.Result is HttpUnauthorizedResult)
        {
            filterContext.Result = new RedirectToRouteResult(
                new System.Web.Routing.RouteValueDictionary 
                    { 
                            { "language", filterContext.RouteData.Values[ "language" ] }, 
                            { "controller", "Account" }, 
                            { "action", "LogOn" }, 
                            { "ReturnUrl", filterContext.HttpContext.Request.RawUrl } 
                    });
        }
    }
}

Просто используйте этот атрибут вместо атрибута авторизации по умолчанию. В вашем случае вы можете проверить URL-адрес запроса и, в зависимости от этого, перейти на соответствующую страницу входа.

3 голосов
/ 17 января 2012

Вы можете написать собственный атрибут Authorize и переопределить метод HandleUnauthorizedRequest, в котором вы можете проверить, был ли сделан запрос администратору или нет, и соответственно перенаправить.

Что-то вроде:

public class MyAuthorizeAttribute: AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        var area = filterContext.RequestContext.RouteData.Values["area"] as string;
        if (string.Equals("admin", area, StringComparison.OrdinalIgnoreCase))
        {
            // if the request was for a resource inside the admin area
            // redirect to a different login page than the one in web.config
            // in this particular case we redirect to the index action
            // of the login controller in the admin area. Adapt this
            // accordingly to your needs. You could also externalize this 
            // url in the web.config and fetch it from there if you want

            var requestUrl = filterContext.HttpContext.Request.Url;
            var urlHelper = new UrlHelper(filterContext.RequestContext);
            var url = urlHelper.Action(
                "index", 
                "login", 
                new 
                { 
                    area = "admin", 
                    returnUrl = requestUrl.ToString() 
                }
            );
            filterContext.Result = new RedirectResult(url);
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

А теперь используйте этот пользовательский атрибут авторизации вместо атрибута по умолчанию.

0 голосов
/ 11 апреля 2013

Обязательно используйте filterContext.RouteData.DataTokens ["area"]; вместо filterContext.RouteData.Values ​​["area"];

public class AreaAuthorizeAttribute : AuthorizeAttribute
{
    public string LoginController = "Account";
    public string LoginAction = "Login";

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        if (filterContext.Result is HttpUnauthorizedResult)
        {
            var area = filterContext.RouteData.DataTokens["area"];
            filterContext.Result = new RedirectToRouteResult(
                new System.Web.Routing.RouteValueDictionary 
                { 
                    { "area", area},
                    { "controller", LoginController }, 
                    { "action", LoginAction }, 
                    { "ReturnUrl", filterContext.HttpContext.Request.RawUrl } 
                });
        }
    }

использовать так:

[AreaAuthorizeAttribute (LoginController = "AreaLoginController", Role = "Администратор")]

...