‫۹ سال و ۱ ماه قبل، جمعه ۱۳ شهریور ۱۳۹۴، ساعت ۲۰:۲۷
با تشکر بابت مقاله مفیدی که منتشر کردید.
خودم هم قصد داشتم مطلبی درباره موضوع مرتبط به این مقاله (SecurityStamp) منتشر کنم که الان با توضیحات کامل شما دیگه لزومی نمی‌بینم این کار را انجام دهم.
فقط باید توجه داشت که مقدار دهی Interval با 
TimeSpan.FromMinutes(0)
به معنای کوئری زدن در هر درخواست از دیتابیس برای رفرش کردن نقش‌های کاربر نیز میباشد. حال اگر سیستم بزرگ بوده و علاوه بر گروه‌های کاربری ، دارای سیستم دسترسی‌ها داینامیک هم باشد امکان دارد زمان گزارش گیری کمی افزایش یابد و با تعداد زیاد کاربران  این عمل به صرفه نخواهد بود.
کاری که خودم در پروژه <<طراحی فریمورکی برای کار با Asp.net MVC و EF >> انجام دادم به این صورت است که یک فیلد به نام IsChangedPermissions در کلاس کاربر قرار دادم تا هر وقت دسترسی‌ها او تغییر کند این فیلد را با مقدار true مقدار دهی کنم و  با این صورت لازم نیست در هر درخواست دسترسی‌های کاربر از دیتابیس واکشی شوند . و اگر لازم بود اکانت کاربر را به صورت آنی غیر فعال کنیم کافیست فیلد SecurityStamp او را با متد یاد شده در مطلب تغییر دهیم که این امر با توجه به مقدار دهی interval با مقدار 0 ، سبب خروج کاربر مورد نظر از حساب خود خواهد شد.
البته لازم است بعد از چک کردن فیلد IsChangedPermissions ، اگر مقدار true را در برداشت آن را false مقدار دهی کنیم تا برای درخواست‌های بعدی مشکلی پیش نیاید.
برای این منظور یک SecurityStampValidator شخصی سازی شده در نظر گرفتم که قسمت مد نظر برای تغییر به صورت زیر است:
 if (validate)
                {
                    var manager = context.OwinContext.GetUserManager<ApplicationUserManager>();
                    var userId = getUserIdCallback(context.Identity);
                    if (manager != null)
                    {
                        var user = await manager.FindByIdAsync(userId).WithCurrentCulture();
                        var reject = true;
                        // Refresh the identity if the stamp matches, otherwise reject
                        if (user != null && manager.SupportsUserSecurityStamp)
                        {
                            var securityStamp =
                                context.Identity.FindFirstValue(Constants.DefaultSecurityStampClaimType);
                            if (securityStamp == await manager.GetSecurityStampAsync(userId).WithCurrentCulture())
                            {
                                reject = false;
                                // Regenerate fresh claims if possible and resign in
                                if (user.IsChangedPermissions && regenerateIdentityCallback != null)
                                {
                                    var identity = await regenerateIdentityCallback.Invoke(manager, user).WithCurrentCulture();
‫۹ سال و ۱ ماه قبل، سه‌شنبه ۱۰ شهریور ۱۳۹۴، ساعت ۱۸:۴۳
این مورد به دلیل این است که Custom Tool مربوط به ویو Index را فراموش کرده باشید به RazorGenerator تنظیم کنید. یا اگر تنظیم کرده اید دقت کنید که کلاس مورد نظر ایجاد شده باشد. اگر نه با Save هر باره ویو این کلاس ساخته میشود.
‫۹ سال و ۱ ماه قبل، دوشنبه ۱۹ مرداد ۱۳۹۴، ساعت ۱۸:۴۳
با توجه به اینکه در ورژن نهایی پروژه ای که ارائه داده اید قسمت زیر در فایل Startup.cs  موجود نیست
appBuilder.CreatePerOwinContext(
               () =>ProjectObjectFactory.Container.GetInstance<ApplicationUserManager>());
و این موضوع باعث خواهد شد تا SecutiyStampValidator  کار کرد صحیحی  نداشته باشد.
‫۹ سال و ۲ ماه قبل، سه‌شنبه ۱۳ مرداد ۱۳۹۴، ساعت ۱۷:۲۶
همچین مشکلی برای بنده پیش نیامده و واقعیتش بنده ادامه ندادم کار با Apache Cordova  را ولی شما در ابتدای کار با چنین مشکلی برخوردید مسلما مربوط است به مراحل نصب و پیکربندی ! اگر مراحل را صحیح و قدم به قدم گفته شده در مقاله قبل جلو رفته باشید نباید مشکلی باشد.
‫۹ سال و ۲ ماه قبل، جمعه ۹ مرداد ۱۳۹۴، ساعت ۲۱:۱۷
با تشکر.
آیا این کتابخانه با کتابخانه EntityFramework.Extended سازگاری دارد؟
چون قصد  دارم از این دو  کنار هم استفاده کنم. یه کاری شبیه به کار زیر
  public IList<string> GetUserPermissions(int[] roleIds, int userId)
        {
            var permissionsOfRoles = (from p in _permissions
                                      from r in p.ApplicationRoles
                                      where roleIds.Contains(r.Id)
                                      select p.Name).Cacheable().Future();

            var permissionsOfUser = (from p in _permissions
                                     from r in p.AssignedUsers
                                     where userId == r.Id
                                     select p.Name).Cacheable().Future().ToList();
            return permissionsOfUser.Union(permissionsOfRoles).ToList();
        }
ولی با خطای 
The source query must be of type ObjectQuery or DbQuery.
Parameter name: source
[ArgumentException: The source query must be of type ObjectQuery or DbQuery.
Parameter name: source]
   EntityFramework.Extensions.FutureExtensions.Future(IQueryable`1 source) +249
مواجه شدم. که مشخص است برای اعمال متد Future باید مبدا از نوع IQueryable باشد.آیا اعمال متد AsQueryable در روند کار کتابخانه EFSecondLevelCache مشکلی ایجاد نخواهد شد؟
‫۹ سال و ۲ ماه قبل، سه‌شنبه ۶ مرداد ۱۳۹۴، ساعت ۰۶:۵۹
یک نکته
امکان Override برخی از Filter ها به صورت  توکار هم ساپورت میشود.سناریو به این شکل بود: یک Child Action که باید امکان فراخوانی با استفاده از Html.RenderAction را با همراه فراخوانی آن Action به صورت Ajax ای هم وجود داشت.
 در پروژه طراحی فریمورک برای کار با Asp.net MVC و EF  به مشکلی بر خوردم که به شرح زیر است: 
خلاصه کار به این صورت بود که ، قرار بود برروی Action مورد نظر  ChildeActionOnly استفاده نشود چرا که در بالا توضیح دادم.از طرفی اگر این Action به [ChildActionOnly] مزین بود، در این صورت نیازی به اعمال فیلتر Authorize به صورت مستقیم بر روی Child Action نبود زیرا به صورت مستقیم قابل فراخوانی نخواهد بود.
هدف Override کردن  فیلتر Authorize بر روی یک Action بود. که با استفاده از فیلتر توکار [OverrideAuthorize] به این هدف رسیدم.