‫۸ سال و ۸ ماه قبل، دوشنبه ۵ بهمن ۱۳۹۴، ساعت ۲۲:۰۶
در نسخه نهایی پروژه شما دو پلاگین قرار دادید. پلاگینی برای اخبار و مقالات و یک پروژه هم برای مدل‌های مشترک که کاربر در این قسمت قرار داره. حالا سوال من اینه که فرضا مدل Tags برای هر دو جدول اخبار و مقالات یکی هست. و ممکنه اصلا ما یک افزونه دیگری هم داشته باشیم که بخواد برچسب بگیره. برای این جور روابط باید به چه شکلی عمل کرد ؟ رابطه‌ی بین جدول اخبار و برچسب‌ها و رابطه بین جدول مقالات و برچست‌ها همگی چند به چند هستند.
‫۸ سال و ۹ ماه قبل، پنجشنبه ۳ دی ۱۳۹۴، ساعت ۲۳:۱۸
آقای نصیری من برای صفحه بندی اطلاعات به این صورت کش میکنم اطلاعات رو :

            var source = users
                .Include(d => d.RolesGroup)
                .Skip(skipRecords)
                .Take(recordsPerPage)
                .Cacheable()
                .ToList();

درست عمل میکنه و فقط بار اول به دیتابیس متصل میشه ولی زمانی که یک رکورد رو حذف میکنم و متد SaveAllChanges رو هم صدا میزنم changedEntityNames همیشه خالی برگشت داده میشه.

من به این صورت رکوردی رو حذف میکنم :

 public async Task<IdentityResult> RemoveByIdAsync(int userId)
        {
            var user = FindById(userId);
            var identityResult = await DeleteAsync(user);
            return identityResult;
        }

به نظرتون مشکل از کجاست ؟
‫۸ سال و ۹ ماه قبل، شنبه ۲۱ آذر ۱۳۹۴، ساعت ۱۷:۴۷
مشکل رو بلاخره متوجه شدم.

اگر به کدهای قرار داده شده در startup نگاه کنید ، همچین کدی وجود داره :
      app.CreatePerOwinContext(
               () => SmObjectFactory.Container.GetInstance<IApplicationUserManager>());
اومدم این کد رو با کد زیر هم تغییر دادم ، ولی اتفاقی رخ نداد :

      app.CreatePerOwinContext(
               () => SmObjectFactory.Container.GetInstance<ApplicationUserManager>());

بعدش اومدم این کد روابتدای دستورات Startup قرار دادم و به درستی کار کرد برنامه.! الان حتی به صورت فیزیکی هم کاربر حذف بشه پس از اولین درخواست کاربر به صفحه لاگین هدایت میشه. در پروژه خودمم همین کارو کردم و مشکل حل شد.
‫۸ سال و ۹ ماه قبل، شنبه ۲۱ آذر ۱۳۹۴، ساعت ۰۷:۴۷
ببینید ، فرض کنید من پروژه آقای نصیری که در اینجا هست رو اجرا می‌کنم ( آخرین نسخه که موارد بالا رو هم داره ) ، و با نام کاربری و رمز عبوری که در seed قرار دادن وارد میشم. خب تا بدین جای کار مشکلی وجود نداره ، حالا من به صورت فیزیکی و توسط sql server تنها یوزری که وجود داره و من باهاش لاگین کردم رو حذف می‌کنم. ولی وقتی دوباره صفحه رو رفرش می‌کنم و به صفحاتی که نیاز به مجوز دارن می‌رم ، اصلا اتفاقی رخ نمیده و انگار واقعا اون کاربر وجود داره در صورتی که وقتی روی لینک Hello admin@example.com!  کلیک می‌کنم ، خطای زیر رخ میده : 

UserId not found.

به عبارتی کاربر وجود خارجی نداره ولی مجوز رفتن به تمامی بخش هایی که مجوز نیاز دارن رو داره. برای این مشکل باید چیکار کرد ؟ الان من validateInterval رو در پروزه آقای نصیری هم 0 کردم ولی باز کاربری که حذف شده داره تو صفحاتی که نیاز به مجوز دارن حرکت میکنه
‫۸ سال و ۹ ماه قبل، جمعه ۲۰ آذر ۱۳۹۴، ساعت ۲۳:۴۰
با سلام
آقای نصیری در آخرین سوال گفتید که باید از UpdateSecurityStampAsync استفاده بشه. من تو برنامم ، بر اساس هر Application_AuthenticateRequest میام چک میکنم که اگر کاربر حذف یا قفل یا ... بود به صورت خودکار Signout بشه. با توجه به نکته امنیتی که که شما گفتید باید اینجا هم از  UpdateSecurityStampAsync  استفاده بشه ، من به این صورت استفاده کردم :


   public class MvcApplication : HttpApplication
    {
        public MvcApplication()
        {
            var wrapper = new EventHandlerTaskAsyncHelper(AuthenticateRequest);
            AddOnAuthenticateRequestAsync(wrapper.BeginEventHandler, wrapper.EndEventHandler);
        }
        private async Task AuthenticateRequest(object sender, EventArgs e)
        {
            if (Context.User == null)
                return;

            //bla bla

            if (هرچیزی که مجاز نباشد)
            {
                var authenticationManager = ProjectObjectFactory.Container.GetInstance<IAuthenticationManager>();
                authenticationManager.SignOut
                (
                    DefaultAuthenticationTypes.ExternalCookie,
                    DefaultAuthenticationTypes.ApplicationCookie
                );
                FormsAuthentication.SignOut();
                await userService.UpdateSecurityStampAsync(userId);
            }
        }
    }

در عمل چک کردم جواب داد ، البته مجبور بودم از یک EventHandlerTaskAsyncHelper استفاده کنم چون نمیشد تو خود متد Application_AuthenticateRequest متدهای Async تعریف کرد.

سوال من اینه ، آیا اصلا نیاز هست در اینجا هم security stamp رو آپدیت کنیم ؟ یا اصلا این روشی که من رفتم از نظر امنیتی درست هست یا خیر.

با تشکر
‫۸ سال و ۱۰ ماه قبل، یکشنبه ۱۵ آذر ۱۳۹۴، ساعت ۰۳:۴۶
ممنون بابت اشاره به پنجره output ، وقتی اون کاری که گفتید رو انجام دادم خطای زیر رخ داد :
Could not load file or assembly 'Microsoft.DNX.PackageManager' or one of its dependencies. The system cannot find the file specified
بعدش اومدم WebToolsExtensions رو آپدیت کردم و مشکل حل شد و برنامه‌ها اجرا شدن.

‫۸ سال و ۱۰ ماه قبل، شنبه ۱۴ آذر ۱۳۹۴، ساعت ۲۰:۱۳
ممنون بابت مطلب.

من نسخه Microsoft.Visual.Studio.Enterprise.2015  رو دانلود و نصب کردم. ولی بعد اینکه پروژه جدیدی باز می‌کنم این missing رخ میده :

اگر راه حلی برای این دارید لطفا بگید چون من هرچی گشتم نتونستم راه حل رو پیدا کنم.

قسمت error list هم به این شکله :


همونطو که میبینید هیچکدوم از اسمبلی‌های AspNet رو نمیشناسه.
‫۸ سال و ۱۰ ماه قبل، سه‌شنبه ۱۰ آذر ۱۳۹۴، ساعت ۱۹:۵۶
آقای نصیری ، پیرو این بازخورد ، از شما تشکر میکنم که پاسخ دادید و مشخص شد مشکل از کدهای من بوده و درخواست‌ها واقعا ارسال میشه. ولی مشکل من هنوز پابرجاست. چون ربطی به بازخورد قبلی نداره این "نظر ارسالی" من ، برای همین مشکلم رو در اینجا دوباره بیان میکنم.

من کدهای این مطلب رو در برنامه قرار دادم  ولی مشکل هنوز پا برجاست. در قسمت سابقه متدها چک کردم و متوجه شدم از کلاس CustomSecurityStampValidator  درخواست‌ها ارسال میشن :

http://s3.picofile.com/file/8225764968/dd.jpg

همونطور که مشاهده می‌کنید درخواست‌ها درست است در Application_AuthenticateRequest رد میشن ولی در اینجا نیز فراخوانی میشن و یا به عبارتی یک کوئری برای هر فایل استایک روی بانک اجرا میشه.

واقعیت امر اینه اصلا نمیدونم چرا این اتفاق رخ میده ولی یک متد با کدهای شما در کلاس CustomSecurityStampValidator قرار دادم و فراخوانی کردم اون رو و مشکل حل شد و دیگه درخواستی ارسال نمیشه و همه‌ی درخواست‌های فایل‌های مورد نظر رد میشن. به این نحو :


  private static bool ShouldIgnoreRequest(CookieValidateIdentityContext context)
        {
            string[] reservedPath =
            {
                "/__browserLink",
                "/img",
                "/fonts",
                "/Scripts",
                "/Content",
                "/Uploads",
                "/Images"
            };
            return reservedPath.Any(
                path => context.OwinContext.Request.Path.Value.StartsWith(path, StringComparison.OrdinalIgnoreCase)) ||
                   BundleTable.Bundles.Select(bundle => bundle.Path.TrimStart('~'))
                       .Any(
                           bundlePath =>
                               context.OwinContext.Request.Path.Value.StartsWith(bundlePath,
                                   StringComparison.OrdinalIgnoreCase));
        }
و برای فراخوانی :

                    //...
                    if (ShouldIgnoreRequest(context)) return;
                    var manager = context.OwinContext.GetUserManager<ApplicationUserManager>();
                    var userId = getUserIdCallback(context.Identity);
                    //...

لطفا اگر اطلاع دارید که چرا این اتفاق ممکنه رخ میده راهنمایی کنید. چرا در اونجا رد میشن ولی باز در این کلاس فراخوانی میشن.

‫۸ سال و ۱۰ ماه قبل، جمعه ۶ آذر ۱۳۹۴، ساعت ۰۰:۳۰
سلام.
من هم مشکل شمارو داشتم و کدهای فایل ajaxfileupload.js رو بررسی کردم و به این تکه کد برخورد کردم:

  $("#" + formElementId + " > input[type='file']").each(function () {
            var oldElement = $(this);
            var newElement = jQuery(oldElement).clone();
            jQuery(oldElement).attr("id", fileId);
            jQuery(oldElement).before(newElement);
            jQuery(oldElement).appendTo(form);
        });
همونطور که میبینید با توجه به کاراکتر <  مشخص شده که  input هایی از نوع file انتخاب بشن که دقیقا در ریشه‌ی formElementId باشند. در صورتی که input‌های من در ریشه اصلی نبودن و اومدم این کاراکتر رو برداشتم و مشکل حل شد.