2015-10-13 4 views
-2

У меня есть сайт MVC 5 (основанный на nopCommerce), и мне нужно заставить всех пользователей войти в систему. То, как я это делал в прошлом на других языках, - это проверить заголовок страницы (так это на каждой странице), если пользователь вошел в систему и перенаправляется на страницу входа, если это не так. Однако я не знаю, как правильно это сделать в MVC. Другие ответы, которые я нашел, говорят, что перенаправление не является чем-то, что нужно сделать в MVC, но это не так, но я не могу понять, как правильно это выполнить. Как перенаправить всех неавторизованных пользователей на страницу входа?Принудительный вход пользователя MVC

+1

проверить это. вам нужно убедиться, что вы разрешаете каждый запрос: http://stackoverflow.com/questions/27024822/adding-authorization-header-with-access-token-for-every-request-using-mvchandler –

ответ

2

Необходимо использовать атрибут Authorize.

О перенаправлении из MSDN:

Если неавторизованный пользователь пытается получить доступ к методу, который помечен устанавливается атрибут авторизовать, рамки MVC возвращает 401 HTTP статус кода. Если сайт настроен на использование аутентификации форм ASP.NET, код статуса 401 заставляет браузер перенаправлять пользователя на страницу входа .

Таким образом, вы можете применить редирект на ваш взгляд входа в web.config, или если вы используете проверки подлинности форм ASP.NET, то он должен переадресовать, как вы хотите на страницу входа в систему.

Существует четыре способа реализации атрибута Authorize по всему миру для каждого контроллера, для каждого метода контроллера или для каждого представления.

Глобально:

Вы можете добавить "AuthorizeAttribute" в "RegisterGlobalFilter" в App_Start, как показано ниже:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilter(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
     filters.Add(new AuthorizeAttribute()); 
    } 
} 

и Application_Start в Global.asax вы должны зарегистрировать этот фильтр:

protected void Application_Start() 
{ 
    FilterConfig.RegisterGlobalFilter(GlobalFilters.Filters); 

    . . . 
} 

На контроллер:

[Authorize] 
public class AccountController : Controller 
{ 
    . . . 
} 

Per метод контроллера:

public class AccountController : Controller 
{ 
    . . . 

    [AllowAnonymous] 
    public ActionResult Register() { . . . } 

    [Authorize] 
    public ActionResult Manage() { . . . } 

    . . . 
} 

Per View:

<!-- With razor syntax --> 

<script type="text/javascript> 
    @if(!Request.IsAuthenticated) { 
     window.location.href = redirectURL; 
    } 
</script> 

<!-- Without razor syntax --> 

<script type="text/javascript> 
    <% if(!Request.IsAuthenticated) { %> 
     window.location.href = redirectURL; 
    <% } %> 
</script> 

Глобальный метод, Iraj ответ.

+0

Если я правильно понимаю , для этого потребуется добавить '[Authorize]' к функции контроллера каждого отдельного представления, что слишком сильно для этого сайта. – vaindil

+0

Взгляните на это: http://stackoverflow.com/a/22597699/4848267. –

3

вы можете добавить "AuthorizeAttribute" в "RegisterGlobalFilter" в App_Start, как показано ниже:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilter(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
     filters.Add(new AuthorizeAttribute()); 
    } 
} 

и Application_Start в Global.asax вы должны зарегистрировать этот фильтр:

protected void Application_Start() 
    { 
     FilterConfig.RegisterGlobalFilter(GlobalFilters.Filters); 

     . 
     . 
     . 
    } 

и каждый контроллер, который вы не должен пользователем Registeration, вы можете использовать «AllowAnonymous» Атрибут над действиями в контроллере Как это:

[AllowAnonymous] 
public ActionResult Login() 
{ 
    //do something 
} 

для получения дополнительной информации, пожалуйста, следовать этому Link

1

, если вы хотите, чтобы разрешить все контроллеры вы можете сделать это ...

положить в Application_Start в Global.asax

GlobalFilters.Filters.Add(new AuthorizeAttribute()); 
Смежные вопросы