من یک برنامه 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؛
    }

}