2012-01-13 2 views
15

Я использую ASP.NET MVC 3, с проверкой подлинности форм (на основе модифицированного кода учетной записи ванили, который вы получаете с файлом-> новым).Почему мой ASP.NET MVC с постоянным файлом cookie не работает?

При входе, я устанавливаю в аутентификации печенье с

FormsAuthentication.SetAuthCookie(userName, true); 

Так это должно установить постоянное печенье. Но если я закрою браузер и снова открою, когда я перейду на сайт, я вынужден снова войти в систему! Я могу увидеть, используя инструменты chrome dev, которые cookie (.ASPXAUTH) создается и не удаляется при закрытии браузера, так что происходит?

Мой web.config:

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

Я проверяю это локально, под IIS, если это делает никакой разницы.

+1

вы можете проверить этот ответ: http://stackoverflow.com/questions/682788/making-user-login-persistant-with-asp-net-membership – alexl

+2

Хорошо, эта ссылка, казалось, сортировала его для меня - приклеивание с SetAuthCookie и настройкой моей конфигурации, чтобы явно указать имя файла cookie (в файле web.confg), и теперь все работает. Weird! –

+0

@Matt Roberts - Я понятия не имею, почему, но настройка имени файла cookie исправила его и для меня. Вы могли бы подумать, что это будет работать с файлом cookie, который является доменом и т. Д. Может быть, это ошибка в MVC или .NET? – Greg

ответ

3

решаемые с комментарием от @alexl:

вы можете проверить этот ответ: Making user login persistant with ASP .Net Membership

Ok, эта ссылка, казалось, сортировать его для меня - прилипание с SetAuthCookie и тонкой настройки моей конфигурации явно задать имя куки (в web.confg), и все работает сейчас. Weird! -

8

Я бы лучше создал себе cookie, используя билет аутентификации. SetAuthCookie создает билет на автомобиль под капотом. Вы пробовали сделать свой собственный билет на авторизацию? Он позволит вам хранить дополнительные данные на нем.

Вот пример:

// create encryption cookie   
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, 
     userName, 
     DateTime.Now, 
     DateTime.Now.AddDays(90), 
     createPersistentCookie, 
     string.Empty); 

// add cookie to response stream   
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);  
System.Web.HttpCookie authCookie = new System.Web.HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 
if (authTicket.IsPersistent) 
{  
     authCookie.Expires = authTicket.Expiration; 
} 
System.Web.HttpContext.Current.Response.Cookies.Add(authCookie); 

Надеется, что это помогает.

+0

Спасибо. Так что я не должен использовать SetAuthCookie? Документация MSDN говорит мне использовать это для создания файла cookie, который может быть постоянным. Кроме того, код ванили для нового приложения MVC использует SetAuthCookie - это неправильно? –

+0

SetAuthCookie() делает глобально то же самое. Это просто странно, потому что кажется, что он не работает все время. Я предпочитаю создавать myslef билет проверки подлинности и добавлять его в поток ответов. –

+0

проверьте также ссылку @alexl, размещенную как комментарий к вашему вопросу. –