У меня есть приложение 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;
}
}