2014-10-28 4 views
18

Я создал новый проект ASP.NET MVC 5 для тестирования атрибута [Authorize] с помощью FormsAuthentication.SetAuthCookie. Я просто установить куки в одном действии (в моем доме контроллер):FormsAuthentication.SetAuthCookie не [Авторизоваться] в MVC 5

public ActionResult About() 
    { 
     FormsAuthentication.SetAuthCookie("someUser", false); 

И я ограничить доступ к другому:

[Authorize] 
    public ActionResult Contact() 
    { 

Когда я запускаю мою веб-страницу и перейдите к /home/contact, я правильно я перенаправляется на страницу входа в систему. Затем я перехожу к /home/about, получу свой файл cookie и вернусь на страницу контактов. Но я все еще перенаправлен на страницу входа в систему - cookie не аутентифицирует/не авторизует меня.

В отладчике HttpContext.User.Identity.IsAuthenticated == false, когда я загружаю страницу About несколько раз (то есть, он никогда не видит, что я аутентифицирован даже после установки файла cookie auth).

Есть ли какой-то дополнительный шаг, который нужно сделать здесь? Мне не нужно устанавливать собственный IPrincipal для базовой проверки подлинности, не так ли?

+5

MVC5 больше не использует проверку подлинности форм, проверьте web.config для <удалите имя = "FormsAuthentication" /> . если вы хотите его использовать, следуйте этой статье, вы можете использовать owin для ее обработки. http://blogs.msdn.com/b/webdev/archive/2013/07/03/understanding-owin-forms-authentication-in-mvc-5.aspx – DSR

+1

После некоторого исследования OWIN кажется, что это лучше вариант, видя, как Microsoft идет в этом направлении для MVC 6. Я использовал [Идентификация ASP.NET без базы данных] (https://github.com/leeenglestone/ASP.NET-Identity-Without-a-Database) как пример аутентификации и авторизации. Это намного сложнее, чем простой «SetAuthCookie», но он кажется более надежным в будущем. – user655321

+1

Человек, это куча doo doo. Почему Microsoft делает это дерьмо? – Hill

ответ

9

EDIT: Я не знал, что новые проекты MVC5 по умолчанию были удалены с удалением формы (модуль удален), поэтому убедитесь, что вы также проверяете комментарий DSR под своим исходным сообщением в конъюнктуре со всем этим.

Проверьте web.config и найдите раздел аутентификации, он должен выглядеть примерно так,

<authentication mode="Forms"> 
    <forms loginUrl="..." cookieless="UseCookies" /> 
</authentication> 

http://msdn.microsoft.com/en-us/library/1d3t3c61%28v=vs.85%29.aspx

значение Cookieless по умолчанию является «UseDeviceProfile», что означает, что куки используются, если браузер сообщает, что он поддерживает файлы cookie, в противном случае файлы cookie не используются, и он использует значения в querystring для поддержания аутентифицированного состояния (которое необходимо сохранить через обратную передачу).

Во-вторых, убедитесь, что файлы cookie включены в вашем браузере. Если устройство/браузер не поддерживает куки или они выключены, то SetAuthCookie будет вносить изменения в URL, но вы должны перенаправить браузер после вызова SetAuthCookie, используя ...

FormsAuthentication.RedirectFromLoginPage(String, Boolean)... 

Этот метод перенаправляет страницы до места назначения после аутентификации с помощью SetAuthCookie. RedirectFromLoginPage поместит необходимые атрибуты в запрос url для поддержки сеанса входа в систему через обратную передачу. Если вы делаете свои собственные переадресации на сайте здесь и там, вам нужно будет поддерживать этот параметр запроса url перед отправкой назад, проверяя, проверен ли текущий пользователь с HttpContext.Current.User.Identity.IsAuthenticated.

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

FormsAuthentication.RedirectToLoginPage() 

Этот метод будет добавить параметр ReturnUrl в строке запроса, который позже функция «RedirectFromLoginPage» перенаправляет обратно после того, как проверку подлинности.

Если вы заблокировали доступ к пользователям или ролям с элементами местоположения в вашем web.config к путям и ресурсам Forms Authentication автоматически обрабатывает перенаправление на страницу входа в систему, когда пользователь, не прошедший проверку подлинности, пытается получить к ним доступ.

<location path="SomeFolderOnYourSite"> 
    <system.web> 
     <authorization> 
     <deny users="?"/> 
     <allow roles="Administrators"/> 
     </authorization> 
    </system.web> 
    </location> 
43

из web.config Вытащите:

<modules> 
    <!--<remove name="FormsAuthenticationModule" />--> 
</modules> 

или Simples удалить строку в web.config

+4

Сохранял мою жизнь и много часов, которые были почти потеряны ... спасибо! – Flea

+4

В моем случае это было '' – Keith

+2

Почему это не помечено как правильный ответ? Спасла и мою жизнь :) – Koshera

0
<location path="SomeFolderOnYourSite"> 
<system.web> 
    <authorization> 
    <deny users="?"/> 
    <allow roles="Administrators"/> 
    </authorization> 
</system.web> 

походит на это не работает для меня, когда Я использую тот же код с небольшим изменением, он работает **<location path="~/SomeFolderOnYourSite"> <system.web> <authorization> <deny users="?"/> <allow roles="Administrators"/> </authorization> </system.web> </location>**

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