إعادة استخدام المطالبة في regenerateIdentityCallback في Owin Identity في MVC5

StackOverflow https://stackoverflow.com//questions/25042822

سؤال

أنا أستخدم MVC5 بهوية Owin.

أجد صعوبة في إعادة استخدام أي مطالبات مخصصة في regenerateIdentityCallback.

لدي هذا التكوين عند بدء التشغيل (كما هو منصوص عليه في القالب القياسي لمشروع MVC الجديد)

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider
            {
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser, Guid>(
                    validateInterval: TimeSpan.FromSeconds(10),
                    regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
                    getUserIdCallback: (user) => Guid.Parse(user.GetUserId()))
            }
        });

يبدو GenerateUserIdentityAsync كما يلي:(وكذلك المعيار إلى حد كبير من القالب)

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, Guid> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

        // I want here instead of generating new one, just reuse the previous one
        userIdentity.AddClaim(new Claim(ClaimTypes.Sid, Guid.NewGuid().ToString()));

        return userIdentity;
    }

المشكلة هي أنني غير قادر على إعادة استخدام المطالبة ويجب علي دائمًا الحصول على قيمة جديدة لها.بعد التحقيق في الهوية دلل أرى أن this مثيل المستخدم ليس لديه أي مطالبات لأنه مستخدم جديد من قاعدة البيانات و userIdentity يحتوي فقط على المطالبات القياسية كمعرف واسم المستخدم، والتي يتم إنشاؤها بواسطة طريقة CreateIdentityAsync.الحصول على المستخدم من HttpContext.Current غير ممكن، فهو فارغ في هذا المكان.

ما هي أفضل طريقة لإعادة استخدام المطالبة للاحتفاظ ببعض القيم من ملف تعريف الارتباط؟ربما أساءت فهم الغرض من المطالبات.شكرا مقدما لمساعدتكم

هل كانت مفيدة؟

المحلول

يمكنك الحصول على نفس النتيجة من خلال القيام بذلك (context.Identity هي الهوية السابقة):

OnValidateIdentity = context => SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, DtbsUser, Guid>(
                            validateInterval: TimeSpan.FromSeconds(30),
                            regenerateIdentityCallback:
                                (manager, user) =>
                                    user.GenerateUserIdentityAsync(manager, context.Identity),
                            getUserIdCallback: (ci) => Guid.Parse(ci.GetUserId())).Invoke(context)

نصائح أخرى

لقد استسلمت وخلقت الخاصة SecurityStampValidator الذي يفعل تمامًا نفس الشيء الأصلي، ولكنه يمرر معرف المطالبات الحالي إلى regenerateIdentityCallback كمعلمة.لست سعيدًا على الإطلاق بهذا الحل، لكنه يعمل.

       OnValidateIdentity = MySecurityStampValidator.OnValidateIdentity<ApplicationUserManager, DtbsUser, Guid>(
                    validateInterval: TimeSpan.FromSeconds(10),
                    regenerateIdentityCallback: (manager, user, previousIdentity) => user.GenerateUserIdentityAsync(manager, previousIdentity),  
                    getUserIdCallback: user => Guid.Parse(user.GetUserId()))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top