2013-11-22 4 views
6

Я работаю над приложением ASP.NET MVC 4 и использую «SimpleMembershipProvider». Приложение будет использоваться в интрасети, и для неавторизованных пользователей не будет контента, поэтому я хочу принудительно ввести логин перед тем, как предоставить пользователю фактический контент сайта.Как заставить пользователя войти в систему, чтобы просмотреть какой-либо контент с помощью ASP.NET MVC 4

Я думаю, что это должна быть довольно тривиальная задача, но это первый раз, когда я должен реализовать такую ​​логику, и я также хочу это сделать MVC 4/SimpleMemebrship, поэтому я обращаюсь за советом.

Я так думаю, что это должно быть реализовано в первую добавить это в web.config:

<authentication mode="Forms"> 
     <forms loginUrl="~/Account/Login" timeout="15" slidingExpiration="true" enableCrossAppRedirects="false" protection="All" /> 
    </authentication> 

все-таки я не буду иметь действие, которое позволит анонимно, так что я думаю, что лучше поставить это Вот.

И меняю маршрут по умолчанию на:

routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional } 
      ); 

Который, как я вижу это, будет единственное действие, которое позволит анонимным. Однако я немного обеспокоен изменением маршрута по умолчанию на Login. Я не уверен, что это не приведет к неожиданным недостаткам.

У меня тоже есть идея, чтобы сохранить структуру по умолчанию, созданный MVC 4 Internet Template и просто оставить Index действия Home контроллера брать на себя ответственность, но мне не нравится этот сценарий, потому что логика ясна - пользователь должен быть зарегистрирован в чтобы получить какой-либо доступ, и даже Home/Index - это некоторый доступ на мой взгляд.

Итак, каков способ реализации такого поведения? Каковы основные шаги, которые я должен внести, чтобы реализовать это право?

ответ

19

Вы можете достичь этого, зарегистрировав атрибут Authorize как глобальный фильтр. Беллоу является примером того, как ваш метод RegisterGlobalFilters должен выглядеть следующим образом:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new AuthorizeAttribute()); 
} 

с этим на месте, вы будете иметь, чтобы разрешить анонимным пользователям доступ к странице входа. Для этого вы аннотируете свой метод действия входа с атрибутом AllowAnonymous.

[AllowAnonymous] 
[HttpGet] 
public ActionResult Login() 
{ 
... 
} 

Сделайте то же самое для метода действия входа, который получает запрос POST.