Проблема создания файла cookie постоянной аутентификации: ASP.NET MVC - PullRequest
13 голосов
/ 05 ноября 2010

ОК, вот мой код для создания файла cookie аутентификации:

        // get user's role
        List<UserType> roles = rc.rolesRepository.GetUserRoles(rc.userLoginRepository.GetUserID(userName));
        List<string> rolesList = (from r in roles
                                 select r.ToString()).ToList();
        string[] rolesArr = rolesList.ToArray();

        // create encryption cookie
        FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
                1,
                userName,
                DateTime.Now,
                DateTime.Now.AddDays(90),
                createPersistentCookie,
                String.Join(";",rolesArr) //user's roles 
                );

        // add cookie to response stream
        string encryptedTicket = FormsAuthentication.Encrypt(authTicket);

        System.Web.HttpCookie authCookie = new System.Web.HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
        System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);
        //FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);

А вот мой код в Global.asax для установки пользовательских ролей в личность пользователя:

    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie == null || authCookie.Value == "")
        {
            return;
        }
        FormsAuthenticationTicket authTicket = null;
        try
        {
            authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            string[] roles = authTicket.UserData.Split(new char[] { ';' });
            if (Context.User != null)
            {
                Context.User = new System.Security.Principal.GenericPrincipal(Context.User.Identity, roles);
            }
        }
        catch
        {
            return;
        }
    }

Однако, если «createPersistentCookie» имеет значение TRUE в верхнем примере, постоянный файл cookie не создается.Если я раскомментирую последнюю строку следующим образом:

        //System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);
        FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);

, на моем жестком диске будет создан постоянный файл cookie.НО тогда в коде Global.asax поле UserData в «authTicket» пустое, поэтому я не могу правильно настроить роли!

Поэтому мне нужно использовать SetAuthCookie для создания постоянного cookie, но затемпо какой-то причине поле UserData исчезает из постоянного файла cookie.

Каков ответ на этот вопрос?

1 Ответ

17 голосов
/ 06 ноября 2010

Чтобы создать постоянный файл cookie, необходимо установить свойство Истекает :

if (authTicket.IsPersistent)
{
    authCookie.Expires = authTicket.Expiration;
}
...