2013-05-05 2 views
7

Я пытаюсь создать анонимный контроллер для проверки подлинности формы. Я настроил свой IIS 7 с анонимной и аутентификацией формы включил и установил мой web.config на deny анонимных пользователей. В контроллере входа я положил украшение [AllowAnonymous] на мой контроллер (и мои действия).Формы Аутентификация и авторизация MVC 4

Единственное действие, которое я могу выполнить с этим набором настроек, - это действие входа (которое возвращает вид «входа»), и я предполагаю, что MVC позволяет мне получить это действие, потому что я установил его как логин URL на моем веб-сайте.

Вот мой веб-конфигурации конфигурации:

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

Все другие действия перенаправляются к действию входа. В этом наборе конфигурации я не могу выполнить другие важные действия, такие как восстановление пароля, регистрация и т. Д.

Что я делаю неправильно?

+0

Вы не можете отказать глобально - Pasword восстановление или регистрация должны быть доступны анонимно. –

+0

Так что мне нужно изменить? Если я разрешаю анонимный доступ, тогда доступен весь сайт, и MVC не перенаправляет не прошедшего проверку пользователя пользователя на действие входа. – Shahar

+0

См. Мой ответ .. –

ответ

14

Используйте глобальный фильтр подлинности пользовательского поведения вместо конфигурации авторизации в web.config (лучше всего подходит для MVC)

добавить глобальный фильтр

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

Тогда [AllowAnonymous] будет работать, и все остальные контроллеры и действия требуют авторизации.

+0

Можете ли вы привести пример? – Shahar

+0

..ид, например – hVostt

+0

Спасибо!стоит упомянуть: после добавления авторизованного фильтра вам понадобится (как и я), чтобы разрешить анонимный доступ к вашему сайту. – Shahar

0

ли вы пытаетесь разрешить анонимный авторизацию для URL, как в образце ниже

<location path="Login/Login"> 
    <system.web> 
     <authorization> 
      <allow users="*" /> 
     </authorization> 
    </system.web> 
</location> 

Аналогично это вы должны быть настройки для ResetPassword/Восстановление пароля/Регистрация и т.д. ...

+0

Украшение не достигает такого же поведения? – Shahar

1

Существует два возможных подхода.

Во-первых - вы можете отклонить анонимные запросы по всему миру с помощью атрибута Authorize и пометить эти несколько, которым не требуется авторизация с атрибутом AllowAnonymous (который является новым для MVC4).

Во-вторых - не отрицайте глобально, а достаточно защитите выбранные контроллеры/действия с помощью атрибута Authorize.

+0

Это неточно в отношении вашего первого подхода: если вы отклоняете анонимные запросы и не добавляете фильтр авторизации, вы не сможете совершить какое-либо действие помимо действия входа, а атрибут AllowAnonymous не будет принят во внимание MVC – Shahar

+0

. Я не был достаточно ясен, отказ, конечно же, должен выполняться с помощью Authorize. Я надеюсь, что отредактированная версия понятна. Благодарю. –

11

Вы также можете зарегистрировать Authorize фильтр RegisterGlobalFilters метода:

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

И затем использовать атрибут AllowAnonymous на методах действий, которые требуют анонимного доступа:

[Authorize] 
public class AccountController : Controller 
{ 
    [AllowAnonymous] 
    public ActionResult RecoverPassword() 
    { 
    ... 
    } 
} 
+1

Спасибо, hVostt был за 2 минуты до вас – Shahar

+0

Нет проблем. Рад, что ты получил свой ответ :) – Kamyar

Смежные вопросы