من یک برنامه MVC دارم که از عضویت Active Directory برای تأیید اعتبار کاربر استفاده می کند.
بعد از اینکه کاربر وارد سیستم شوید ، [ FormsAuthenticatedTicket
ایجاد و رمزگذاری می شود. سپس ، در Application_PostAuthenticateRequest
بلیط رمزگشایی می شود و داده های کاربر deserialized در یک اصلی اصلی سفارشی ذخیره می شوند.
مشکل من این است که وقتی کاربر پس از اتمام کوکی خود وارد شود ، بلیط رمزگذاری می شود اطلاعات ورود به سیستم فعلی ، اما در global.asax بلیط قبلی ورود هنوز رمزگشایی شده است. هنگام اشکال زدایی ، من داده های بلیط ورود به سیستم قبلی همان کاربر را با نسخه 2 دیده ام.
چه اشتباهی مرتکب شدم؟
Web.config:
روش ورود به سیستم پس از اقدام من
[HttpPost]
[AllowAnonymous]
عمومی ActionResult ورود به سیستم (نام کاربری رشته ، گذرواژه رشته ، یادآوری کلمه عبور ، بازگشت رشته)
{
if (string.IsNullOrWhiteSpace (نام کاربری) || string.IsNullOrWhiteSpace (رمز عبور))
{
ViewBag.Message = FormattedMessage.GetFormattedMessage ("Veuillez Entrer l'utilisateur et / ou mot passe"، TypeMessage.Danger ، درست)؛
این را برگردانید. مشاهده ()؛
}
if (Membership.ValidateUser (نام کاربری ، رمزعبور))
{
FormsAuthentication.SetAuthCookie (نام کاربری ، به یاد داشته باشید)
// JavaScriptSerializer js = JavaScriptSerializer جدید ()؛
PrincipalContext principalContext = جدید PrincipalContext (ContextType.Domain)؛
var userAD = UserPrincipal.FindByIdentity (principalContext ، نام کاربری)؛
var intervenant = unitOfWorkBll.UserBLL.GetAllFiltered (u => u.Matricule == userAD.EmployeeId ، شامل: "IntervenantRoles.Role ، IntervenantStructures.Structure") SingleOrDefault ()؛
// string userData = js.Serialize (مداخله)؛
string userData = JsonConvert.SerializeObject (مداخله ، قالب بندی. برنامه ریزی شده ، JsonSerializerSettings جدید
PreserveReferencesHandling = PreserveReferencesHandling.Objects
})؛
بلیط فرمهای FormsAuthenticationTicket = FormsAuthenticationTicket جدید (1 ، نام کاربری ، DateTime.Now ، DateTime.Now.AddMinutes (10) ، به یاد داشته باشیدMe ، userData)؛
string encryelledTicket = FormsAuthentication.Encrypt (بلیط)؛
کوکی HttpCookie = HttpCookie جدید (FormsAuthentication.FormsCookieName ، رمزگذاری شده Ticket)؛
Response.Cookies.Add (کوکی)؛
if (! string.IsNullOrWhiteSpace (ReturnUrl))
{
این را برگردانید. Redirect (ReturnUrl)؛
}
این را برگردانید. RedirectToAction ("فهرست" ، "صفحه اصلی")؛
}
ViewBag.Message = FormattedMessage.GetFormattedMessage ("l'utilisateur et / ou le mot passe نادرست است."، TypeMessage.Danger ، درست)؛
این را برگردانید. مشاهده ()؛
}
asax جهانی
از درجه اعتبار ساقط محافظت می شود Application_PostAuthenticateRequest (ارسال کننده شی ، رویدادهای مختلف)
{
HttpCookie autoCookie = Request.Cookies [FormsAuthentication.FormsCookieName]؛
اگر (autoCookie! = null)
{
بلیط FormsAuthenticationTicket = FormsAuthentication.Decrypt (autoCookie.Value)؛
کاربر مداخله = JsonConvert.DeserializeObject (بلیط.UserData / * ، JsonSerializerSettings جدید
PreserveReferencesHandling = PreserveReferencesHandling.Objects
} * /)؛
CustomADPrincipal customADPrincipal = CustomADPrincipal جدید (کاربر)؛ ؛
HttpContext.Current.User = customADPrincipal؛
}
}