formauthenticationticket расшифровывается с предыдущими данными входа - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть приложение MVC, которое использует членство в Active Directory для аутентификации пользователя.

После входа пользователя в систему создается и шифруется FormsAuthenticatedTicket. Затем в Application_PostAuthenticateRequest билет дешифруется, и десериализованные пользовательские данные сохраняются в пользовательском объекте участника.

я изменил дату истечения срока действия билета с AddMinute (30) на AddMenute (10)

Моя проблема в том, что когда пользователь входит в систему после истечения срока действия cookie, билет зашифровывается с текущими данными для входа, но в global.asax билет предыдущего входа по-прежнему дешифруется. При отладке я видел данные билета за предыдущую дату истечения (после 30 минут, а не 10 минут) того же пользователя с расшифровкой версии билета до 2.

Какую ошибку я допустил?


Редактировать: Я решил эту проблему, удалив FormsAuthentication.SetAuthCookie(userName, rememberMe);, потому что я использовал объект FormsAuthenticationTicket

, но я столкнулся с другой проблемой: в глобальном asax Application_PostAuthenticateRequest при попыткедля чтения cookie, я обнаружил, что отладчик имеет нулевое значение, хотя cookie добавлен с зашифрованным тикетом

string encryptedTicket = FormsAuthentication.Encrypt(ticket);
        HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);

        Response.Cookies.Add(cookie); 

У меня есть два пользователя: эта проблема возникает с одним из них, но с другим проблема не возникает

пожалуйста, как решить эту проблему? Web.config:

 <authentication mode="Forms">
    <forms name=".ADAuthCookie" loginUrl="~/Account/Login">
    </forms>
 </authentication>

 <membership defaultProvider="ADMembershipProvider">  
   <providers>
     <clear/>
     <add name="ADMembershipProvider" 
          type="System.Web.Security.ActiveDirectoryMembershipProvider" 
          connectionStringName ="ADconnectionString"
           attributeMapUsername="sAMAccountName" />  

    </providers>  
 </membership>

мой метод входа в систему после действия

[HttpPost]
[AllowAnonymous]
public ActionResult Login(string userName, string password, bool rememberMe, string returnUrl)
{

    if (string.IsNullOrWhiteSpace(userName) || string.IsNullOrWhiteSpace(password))
    {
        ViewBag.Message = FormattedMessage.GetFormattedMessage("Veuillez Entrer l'utilisateur et/ou mot passe", TypeMessage.Danger, true);
        return this.View();
    }

    if (Membership.ValidateUser(userName, password))
    {
        //FormsAuthentication.SetAuthCookie(userName, rememberMe);
        //JavaScriptSerializer js = new JavaScriptSerializer();
        PrincipalContext principalContext = new PrincipalContext(ContextType.Domain); 
        var userAD = UserPrincipal.FindByIdentity(principalContext, userName);
        var intervenant = unitOfWorkBll.UserBLL.GetAllFiltered(u => u.Matricule == userAD.EmployeeId, includes: "IntervenantRoles.Role, IntervenantStructures.Structure").SingleOrDefault();
        //string userData = js.Serialize(intervenant);
        string userData = JsonConvert.SerializeObject(intervenant, Formatting.Indented, new JsonSerializerSettings {
            PreserveReferencesHandling = PreserveReferencesHandling.Objects
        });
        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddMinutes(10),rememberMe, userData);

        string encryptedTicket = FormsAuthentication.Encrypt(ticket);
        HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);

        Response.Cookies.Add(cookie);
        if (!string.IsNullOrWhiteSpace(returnUrl) )
        {
            return this.Redirect(returnUrl);
        }

        return this.RedirectToAction("Index", "Home");
    }

    ViewBag.Message= FormattedMessage.GetFormattedMessage("l'utilisateur et /ou le mot passe incorrect.", TypeMessage.Danger, true);

    return this.View();
}

global asax

protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
    HttpCookie autoCookie = Request.Cookies[FormsAuthentication.FormsCookieName];

    if (autoCookie != null)
    {
        FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(autoCookie.Value);
        Intervenant user = JsonConvert.DeserializeObject<Intervenant>(ticket.UserData/*, new JsonSerializerSettings {
            PreserveReferencesHandling = PreserveReferencesHandling.Objects
        }*/);

        CustomADPrincipal customADPrincipal = new CustomADPrincipal(user); ;

        HttpContext.Current.User = customADPrincipal;
    }

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