مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

alibahman47

عضویت از 1395/11/13

نمایش کاربران آنلاین و بلاک کردن کاربران در Identity 2

  • دوشنبه 9 مرداد 1396
  • 11:19
تشکر میکنم

درود ,

دوتا سوال در مورد Identity 2 :

1 -  چطوری میشه یک کاربر رو غیر فعال یا بلاک کرد که نتونه دیگه به سایت وارد بشه و اگر هم تو سایت باشه آنی Logout بشه ؟

تو StackOverFlaow چند مورد رو تست کردم ولی جواب نگرفتم - فیلد IsEnabled رو هم به جدول کاربران اضافه کردم که در پایین میبینید- اگه امکان داره یکم به زبان شیرین فارسی توضیح بدید.

2 -چطور میشه فهمید که چه کاربری آنلاینه و چه کاربری آفلاین ؟

فیلد های زیر کاربردشون چیه ؟

پاسخ های این پرسش

تعداد پاسخ ها : 28 پاسخ
کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • دوشنبه 9 مرداد 1396
  • 11:46

1) مورد اول رو میتوان با یک Property به نام IsBaned حل کرد و هنگام ورد حساب کاربر آن را چک کرد، راه های دیگر هم وجود دارد مثلا مسدود کردن از طریق ip یا اضافه کردن ایمیل کاربر به لیست سیاه و ... ( انتخاب با شماست)

2)برای این که کاربران آنلاین را دریافت کنید مانند مورد اول راه های زیادی وجود دارد اگر هم جستجو کنید هر یک روش خود را برای انجام این کار انجام داده است، یک نکته مهم در این موضوع این که برای انجام این کار از بانک استفاده نکنید به دست آوردن کاربران آنلاین از روی بانک یه فشار بر روی سیستم است.

راه های موجود :

از طریق کش Http Runtim می شود این کار را انجام داد

یک نمونه دیگر

ازطریق پیاده سازی یک فیلتر

این نکته رو هم اضافه کنم که این مسئله ربطی به Identity 2.0 ندارد و همچین امکانی برای آن پیداه سازی نشده خودتان باید این سیستم را پیاده کنید.

3)این Property در کلاس IdentityUser قرار دارد که میتوان با استفاده از آن کاربر را قفل کنید و برای آن قفل بودن آن زمان تایین کنید یه جورایی کار مورد اول هم میتوانید با این خصوصیت حل کنید برای استفاده از این ویژگی میتوانید به کلاس UserManager مراجعه کنید تا امکانات در این باره برای شما قرار دهد.

برای مطالعه بیشتر :

^

^

^

^

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • دوشنبه 9 مرداد 1396
  • 14:48

این مورد :

Disable User in ASPNET identity 2.0

فقط از ورود افراد که بلاک شده باشن جلوگیری میکنه در صفحه ورود!

اگه کاربر در حالی که قبلا لاگین کرده و  تو سایت باشه بلاک بشه هم باید آنی از سایت LogOut بشه ! این خیلی مهمه.

درهر بار Load یک صفحه در کدوم قسمت Identity چک میشه که ببینه اون کاربر عضو هست یا نه ؟تا من در اون قسمت کد چک کردن True بودن این فیلد رو هم اضافه کنم .

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • دوشنبه 9 مرداد 1396
  • 16:02

سیستم Identity بسیار هوشمند است و هنگامی اطلاعات مربوط به احراز هویت کاربر تغییر کند آن را logout می کند.

سوال دوم رو متوجه نشدم بیشتر توضیح بدید

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • سه شنبه 10 مرداد 1396
  • 11:58

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

این سوال آخر هم که پرسیدم همین بود :

به جز در زمان لاگین (که کد رو نوشتم و حله ),

من در کجای Identity ,  باید true بودن فیلد LockOutEnable رو چک کنم تا که در هر بار رفرش شدن صفحه یا باز کردن هر صفحه جدید ,چک بشه تا اگه طرف بلاک شده بود از سایت بیرون انداخته بشه.

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • سه شنبه 10 مرداد 1396
  • 12:04

پس از این که کاربر را Lockout کردید متد UpdateSecurityStampAsync را فراخوانی کنید تا Identity متوجه شود تغییری بر روی اطلاعات کاربر رخ داده است. اگر این روش جواب داد که هیچ اگر نه آن را بیان کنید تا روشی دیگری را به شما ارئه بدم

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • چهارشنبه 11 مرداد 1396
  • 03:14

در قسمت زیر منظورتونه :

دقیقا چه کدی رو بزنم ؟ لینک منبع ندارید ؟مثل قبلی ؟

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

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • چهارشنبه 11 مرداد 1396
  • 10:44

خیر نباید در قسمتی که نشان داده اید گذاشته شود. لازم نیست ما به صورت دستی چک آیا کاربر Lockout است و یک کد اضافه است. قضیه راحت تر از این حرفاست :).

ماباید یک SecurityStampValidator از طریق OnValidateIdentity به Provider احراز هوییت Cookie یا همان  CookieAuthenticationProvider اضافه کنیم. مراحل زیر را دمبال کنید:

ابتدا برای به کلاس ApplicationUserManager می رویم یک متد به نام OnValidateIdentity ایجاد کنید:

    public Func<CookieValidateIdentityContext, Task> OnValidateIdentity()
        {
            return SecurityStampValidator.OnValidateIdentity<AppUserManager, User, Guid>
                (TimeSpan.FromSeconds(0), GenerateIdentityAsync, identity => Guid.Parse(identity.GetUserId()));
        }

به جای AppUserManager نام Manager خود را قرار دهید.

به جای User نام User خود را دهید.

به جای Guid نوع کلید اصلی کلاس User را قرار دهید.

پارامتر اول می گوید : زمانی که اطلاعات کاربر تغییر کرد در چه مدت زمانی آن را logout کنم که ما آن را صفر قرار دادیم.

پارامتر دوم می گوید: به من ClaimsIdentity بدهید تا claims های ایجاد شده را با خودم ببرم و در Cookie ثبت کنم.

پارمتر سوم برای دریافت UserId ثبت شده در Claims می باشد.

برای پارامتر دوم یک متد ایجاد میکنیم و اگر Claim مد نظرمان بود به بقیه آن ها اضافه می کنیم:

      public async Task<ClaimsIdentity> GenerateIdentityAsync(AppUserManager manager, User user)
        {
            var identity =
                await CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie).ConfigureAwait(false);
            identity.AddClaim(new Claim("emailAddress", user.Email));
          
            return identity;
        }

پس از این که دو مورد را با موفقیت به انجام رساندیم، آماده مسافرت به کلاس Startup.cs می شوییم :)

در این کلاس ما باید تنظیماتی را برروی سیستم احراز هویت Cookie انجام دهیم:

         app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                
                ExpireTimeSpan = TimeSpan.FromDays(30),
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/account/login"),
                LogoutPath = new PathString("/account/logout"),
              
                Provider = new CookieAuthenticationProvider()
                {
                    OnValidateIdentity = /*OnValidateIdentity(),*/,
                    OnApplyRedirect = c =>
                    {
                        if (c.Request.IsAjaxCall() && c.Response.StatusCode == 200)
                            c.Response.StatusCode = 401;
                        else
                            c.Response.Redirect(c.RedirectUri);
                    }
                }
            });

قسمتی که کامنت کرده ام متد OnValidateIdentity را فراخوانی کنید.

حال میروم سراغ lockout کردن شما میتوان چند تنظیم برروی آن انجام دهید می رویم به ApplicationUserManager :

در سازنده کلاس ApplicationUserManager خصوصیات زیر را مقدارد دهی کنید:

     UserLockoutEnabledByDefault = true;
     MaxFailedAccessAttemptsBeforeLockout = 6;
    DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(15);

تیم ASP.NET پنج متد برای شما برای کار با Lockout قرار داده است:

            manager.SetLockoutEnabledAsync()
            manager.SetLockoutEndDateAsync()
            manager.GetAccessFailedCountAsync()
            manager.GetLockoutEndDate()
            manager.AccessFailedAsync()

اولی lockout بودن کاربر را تنظیم می کند

دومی تاریخ به اتمام رساندن lockout را تنظیم می کند.

سومی تعداد باری که کاربر تلاش کرده است و شما یک AccessFailed به آن اضافه کردید در بالا بیشتر آن را برروی 6 قرار داده ایم.

چهارمی زمان پیان یافتن lockout را دریافت می کند.

پنجمی یک AccessFailed به کاربر اضافه می کند.

یک کنترلر برای این متد ها ایجاد کنید از آن استفاده کنید دیگر لازم به UpdateSecurityStampAsync نیست اگر عمل نکرد آن را اخر  SetLockoutEnabledAsync قرار دهید.

/پایان :)

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • دوشنبه 16 مرداد 1396
  • 03:16

درودبر  آقای علیزاده گرامی 

چند روزی نتونستم به پروژم رسیدگی کنم و حالا اومدم تا این مورد رو انجام بدم .

در همون قسمت  ابتدایی که میبایست کد رو در IdentityConfig.cs بنویسم , چطور باید اطلاعات کاربری رو که الان میخواد لاگین کنه دریافت کنم  ؟؟؟

در کد اوررایت کردن PasswordSignInAsync این کار با پارامتر ورودی میسر بود , ولی حالا من پارامتری رو نمیبینم که بخوام این کار رو بکنم :

درضمن منظور از Manager خودتون رو نگرفم ؟

بجای AppUserManager چی رو باد قراربدم ؟

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • دوشنبه 16 مرداد 1396
  • 11:03

من فقط در بحت خود Identity از CodeFirst استفاده کردم و کل پایگاه داده پروژه و بقیه از روش DatabaseFirsts است , این مورد به انجام نشدن این مسله ربطی دارد ؟

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • دوشنبه 16 مرداد 1396
  • 14:28

این مورد مربوط EF Code First نمی شود.

چند سوال و درخواست:

کلاس startup خود را در فرمت کد قرار دهید نه عکس.

دوتا Context در پروژه شما وجود دارد ؟

مگر از cookie Authentication استفاده نمی کنید ؟

متد OnValidateIdentity  برای اضافه کردن claim ها ایجاد احراز هویت کاربر می باشد.

این اطلاعات به صورت کوکی در مروگر ذخیره می شود و خود Identiy آنها را مدیریت می کند.

اگر میخواهید به اصول پیش بروید که از روشی که من میگم پیش برید در غیر این صورت با Hard Code می شود همه مشکلات را حل کرد ولی ... :)

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • دوشنبه 16 مرداد 1396
  • 14:59

بزارید ابتدا یک توضیح کلی و مهم را بدم که من کل پروژه ها را به روش DataBaseFirst جلو برده ام و بجز در بحث Identity2.0 که خودش از روش CodeFirst  استفاده میکند و با این روش ایجاد شد من در جایی دیگه ای از کدنویسی CodeFirst  استفاده نکردم. 

این رو هم بگم که من Sample Identity 2.1 رو کامل رو پروزه نصب کردم و همه اون چییزایی که لازم داشت به پروژه اضافه شده قطعا.

سوال اول : 

این Startup پروژه بنده هست و متوجه حرفی که زدید نشدم !

سوال دوم :

در مورد Context هم فقط همان یک مورد مربوط به خود identity هست :

و Web.config را بصورت زیر تنظیم کرده :

که نهایتا یک پایگاه داده مشترک را ایجاد کرده :

 

استفاده ازین روش تا به این لحظه هیچ مشکلی را نداشته است.

سوال سوم : 

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

ولی فضای اسمیش رو اضافه کردم :

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • دوشنبه 16 مرداد 1396
  • 15:44

با توجه به این که من از همون مثال Sample مربوط به خود Identity استفاده کردم

Install-Package Microsoft.AspNet.Identity.Samples -Pre

اگه کد ها رو در همون چاچوب بگید میتونم اعمالشون کنم

و یا نمونه سورسی از همون Samle که این موارد بهش اضاف شده باشن بازهم میتونه کد ها رو ازش بیرون بکشم.

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • دوشنبه 16 مرداد 1396
  • 15:53

منظورم از کد های startup کلش بود محتوای ConfigureAuth رو قرار دهید.

Sample خود مایکروسافت یا تیم ASP.NET به آن صورت کامل نیست که جواب گو تمامی نیاز های ما باشد یکسری از چیزها را باید خودمان سفارشی یا اضافه کنیم.

مثلا برای پیاده سازی Lockout باید یه سری قسمت ها را اضافه کنیم تا خودش آن را مدیریت کند. هنگام ورود کاربر ما از PasswordSignInAsync استفاده می کنیم که enum زیر را بازگردانی می کند:

    public enum SignInStatus
    {
        /// <summary>
        /// Sign in was successful
        /// </summary>
        Success,

        /// <summary>
        /// User is locked out
        /// </summary>
        LockedOut,

        /// <summary>
        /// Sign in requires addition verification (i.e. two factor)
        /// </summary>
        RequiresVerification,

        /// <summary>
        /// Sign in failed
        /// </summary>
        Failure
    }

LockedOut نشانه این است که خود Identity به صورت توکار بررسی می کند که کاربر lockout است یا خیر پس نیازی به بررسی دستی نیست.

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • دوشنبه 16 مرداد 1396
  • 16:06

خوب قرارش دادم حالا چی :

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin;
using Microsoft.Owin.Security.Cookies;
using IdentitySample.Models;
using Owin;
using System;

namespace IdentitySample
{
    public partial class Startup
    {
        public enum SignInStatus
        {
            /// <summary>
            /// Sign in was successful
            /// </summary>
            Success,

            /// <summary>
            /// User is locked out
            /// </summary>
            LockedOut,

            /// <summary>
            /// Sign in requires addition verification (i.e. two factor)
            /// </summary>
            RequiresVerification,

            /// <summary>
            /// Sign in failed
            /// </summary>
            Failure
        }
        // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
        public void ConfigureAuth(IAppBuilder app)
        {
            // Configure the db context, user manager and role manager to use a single instance per request
            app.CreatePerOwinContext(ApplicationDbContext.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
            app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
            app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

            // Enable the application to use a cookie to store information for the signed in user
            // and to use a cookie to temporarily store information about a user logging in with a third party login provider
            // Configure the sign in cookie
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login"),
                Provider = new CookieAuthenticationProvider
                {
                    // Enables the application to validate the security stamp when the user logs in.
                    // This is a security feature which is used when you change a password or add an external login to your account.  
                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                        validateInterval: TimeSpan.FromMinutes(30),
                        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
                }
            });
            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

            // Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process.
            app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));

            // Enables the application to remember the second login verification factor such as phone or email.
            // Once you check this option, your second step of verification during the login process will be remembered on the device where you logged in from.
            // This is similar to the RememberMe option when you log in.
            app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);

            // Uncomment the following lines to enable logging in with third party login providers
            //app.UseMicrosoftAccountAuthentication(
            //    clientId: "",
            //    clientSecret: "");

            //app.UseTwitterAuthentication(
            //   consumerKey: "",
            //   consumerSecret: "");

            //app.UseFacebookAuthentication(
            //   appId: "",
            //   appSecret: "");

            //app.UseGoogleAuthentication(
            //    clientId: "",
            //    clientSecret: "");
        }
    }
}

هنوز متوجه نشدم باید اون AppUserManager رو چطوری درست کنم ! هنوز اخطار میده !

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • دوشنبه 16 مرداد 1396
  • 16:13

 دیگر لازم نیست OnValidateIdentity  خودمان را بنویسیم.

حال میتوان یک Controller برای Lockout کردن کاربر ایجاد کنیم و از متد هایی که در بالا گفتم استفاده کنیم.

manager.SetLockoutEnabledAsync()
manager.SetLockoutEndDateAsync()
manager.GetAccessFailedCountAsync()
manager.GetLockoutEndDate()
manager.AccessFailedAsync()

هنگام Login به صورت توکار lockout بودن یا نبودن کاربر check می شود. 

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • دوشنبه 16 مرداد 1396
  • 16:17

لازم نیست SignInStatus را داخل Startup قرار بدهید.

SignInStatus نوع بازگشتی PasswordSignInAsync  می باشد:

این کد درون کلاس SignInManager قرار دارد اگر بررسی کنید منظورم رو متوجه می شوید

        public virtual async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
        {
            if (UserManager == null)
            {
                return SignInStatus.Failure;
            }
            var user = await UserManager.FindByNameAsync(userName).WithCurrentCulture();
            if (user == null)
            {
                return SignInStatus.Failure;
            }
            if (await UserManager.IsLockedOutAsync(user.Id).WithCurrentCulture())
            {
                return SignInStatus.LockedOut;
            }
            if (await UserManager.CheckPasswordAsync(user, password).WithCurrentCulture())
            {
                await UserManager.ResetAccessFailedCountAsync(user.Id).WithCurrentCulture();
                return await SignInOrTwoFactor(user, isPersistent).WithCurrentCulture();
            }
            if (shouldLockout)
            {
                // If lockout is requested, increment access failed count which might lock out the user
                await UserManager.AccessFailedAsync(user.Id).WithCurrentCulture();
                if (await UserManager.IsLockedOutAsync(user.Id).WithCurrentCulture())
                {
                    return SignInStatus.LockedOut;
                }
            }
            return SignInStatus.Failure;
        }

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • دوشنبه 16 مرداد 1396
  • 16:32

خوب این کنترولر باید چه نامی داشته باشه و از چی اینهریت بشه و رو چه حسابی در هر رفرش فراخوانی خواهد شد ؟

بنظرتون نوشت این کدها از اون روشی که در پست جدیدم نوشتم اصولی تره ؟

مگه بیل گیتس هم نگفته بود که حل کردن یک روش به ساده ترین روش ممکن اصولی ترین روشه . واقعا انجام ایین همه کار لازمه ؟چون متاسفانه از سیستم Identity سردرنمیارم.

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • دوشنبه 16 مرداد 1396
  • 16:45

همان کنترلی که برای همیشه استفاده می کنید کنترلر خواصی نمی خواهد.

قرار نیست فراخوانی بشه ، کار خواصی قرار نیست بکنید تنها از متدهایی خود Identiy به شما می دهد استفاده می کنید. 

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

فکر می کنم بهتر باشه یک سمپل برای شما پیاده کنم ؟ یا توضیح بدم ؟

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • دوشنبه 16 مرداد 1396
  • 17:12

خیلی شرمندم که این همه زحتتنون میدم , بنده خود Mvc تغرییبا کامل بلدم و به ندرت پیش میاد سوالی راجش بپرسم و خودم با برسی همه کار هام رو حل میکنم ولی متاسفانه چون برای Identity فیلم اموزشی درسی برای آموزش نداشته ام و زیاد مباحث رو مسلط نیسم .

باور کنید در پروژه جاری بعضی جا ها مثل اضافه کردن محصول جدید که یک ViewModel که از هشت جدول مختلف شامل شده بود (مثل جدول محصول و رنگ و سایز و گارانتی و برند و دسته بندی و فیلر ها و و ...) رو در دور روز با نوشتن 4000 خط کد تکمیل کردم و حتی موارد خیلی سخت تر ولی در بحث Identity هنوز مثل مبتی ها دارم برخورد میکنم .

مستندات سایت 

مرجع برنامه نویسان

و

www.dotnettips.info

رو 4 تا 5 دفعه کامل خوندم , و یک سری ویدیو .

اگه Samle باشد خیلی بهتر است . 

مثلا همون Sample که خودش Identity 2.1 ایجاد میکند 

Install-Package Microsoft.AspNet.Identity.Samples -Pre

همین چیز هایی که میگید بهش اضافه شده باشد .

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • دوشنبه 16 مرداد 1396
  • 21:21

اگه وقت کردید و بتونید یه Sample ایجاد کنید و این کد ها رو بهش اضافه کنید واقعا ممنونتون میشم ,

13 روز تا تحویل دادن پروژه وقت دارم واقعا بدجور موندم .

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • دوشنبه 16 مرداد 1396
  • 23:00

تا فردا حاظر میشه.

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • سه شنبه 17 مرداد 1396
  • 00:44
کاربر سایت

alibahman47

عضویت از 1395/11/13

  • چهارشنبه 18 مرداد 1396
  • 04:29

دم شما گرم - واقعا خیلی آقایی , heart

مورد SingOut کردن خوردکار کاربر بعد از بلاک شدن کاملا به درستی انجام میشه و عالیه heart

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

1 - زمانی که یک کاربر رو میخوام Unblock کنم به اخطار زیر میخوره :

2 - در صفحه بلاک کردن و دادن زمان انقضای بلاک یک مقدار پیشفرض بصورت زیر درون Textbox هست این مورد علت خاصی داشته :

3 - با دادن تاریخ یک تغییر بصورت زیر مشاهده میشود :

علت این مورد تغییر تاریخ شمسی به میلادی در زمان ذخیره در دیتابیس و برگشت دوباره تاریخ به شمسی هست , درسته ؟

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • چهارشنبه 18 مرداد 1396
  • 10:56

درست کردن تاریخ رو به عهده خودتون گذاشتم چون وقت گیره باید به صورت شمسی دریافت کنید و ... .

میتوانید به صورت پیش فرض هم زمان تعیین کنید در سازنده کلاس UserManager:

 DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(15);

و میتوانید برای افزودن به صورت زیر عمل کنید :

            manager.SetLockoutEndDateAsync(Guid.NewGuid(), DateTimeOffset.UtcNow.Add(TimeSpan.FromDays(5)));

درست کردنش سادست، پیش نهاد میدم یک DropDown ایجاد کنید که شامل ماه روز ساعت دقیه باشد و براساس آن مقدار دریافت کنید.

خطایی که دریافت کردی مربوط به خالی بود Id کاربر است، سمپل تست شده و مشکلی نداره (بررسی کنید)

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • چهارشنبه 18 مرداد 1396
  • 12:38

ممنون - بابت تاریخ ها حل شد , 

بابت سوال اول که پرسیدم - من همون Sample رو برسی کردم که این Error رو داد , پروژه رو هم دیباگ کردن Id به اشن مربوط فرستاده میشه و 

چند خط هم برای تست اضافه کردم که چک کنه ببینه Id مربوط به کاربر خاصی هست یا نه (برای تست صحت Id) که اون هم درسته ولی به خط مشخص شده که میرسه همون اخطار بالا رو میده :

میشه در این قسمت فیلد ها ی LockoutEnabled و LockoutEndDateUtc رو False ,  Null کنیم . و اطلاعات کاربر رو بروز کنیم .

این کاری اصولی نیست ؟

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • چهارشنبه 18 مرداد 1396
  • 12:59

به جای userManager_ از UserManager استفاده کنید کد های زیر را جایگزین کنید مثال Sample:

                await UserManager.SetLockoutEnabledAsync(model.Id, true);
                await UserManager.SetLockoutEndDateAsync(model.Id, model.LockoutTime);
                await UserManager.UpdateSecurityStampAsync(model.Id);

دلیلی برای انجام این کار نمی بینم.

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • چهارشنبه 18 مرداد 1396
  • 16:35

باز هم ممنون مهندس , واقعا کارت حرف نداره.

سپاسheart

کاربر سایت

alibahman47

عضویت از 1395/11/13

  • شنبه 21 مرداد 1396
  • 10:41

درود دوباره به آقای علیزاده 

این مورد مشکل تاریخ رو که پیش اومده بود من برسی کردم  بابت این مورد  DNTPersianUtils.Core خیلی ممنون ,  تو کل پروژه تست کردم و جواب هم داد و عالی بود.

من کل قسمت هایی که از کاربر تایخ و زمان دیافت میشه و یا با datetime.now تاریخ رو ست میکنیم رو تست کردم و هیچ مشکلی وجود نداشت , فقط تنها ایراد تو همین دریافت تاریخ بلاک کردن کاربر بود  - یعنی صفحه LockUser بود.

اول این مورد خیلی مهم  رو بگم که تاریخ سیستم جاری که پروژه روشه به وقت تهرانه (+3.5)  - تاریخ شمسی و 

در مورد ثبت زمان در دیتابیس هم لازم به تبدیل تاریخ شمسی به میلادی اصلا نیست , چون خود SQl باتوجه به تاریخ سیستم تبدیل ها رو انجام میده , یعنی من اگه یک تاریخ شمسی رو وارد کنم خودش به میدای در دیتابیس ذخیرش میکنه و در زمان خوندن اون تاریخ دوباره اون رو به شمسی تبدیل مینه ,

 به استسنای این فیلد LockoutTime که فکر کنم علتش کد نویسی شیوه ثبت کردنش باعث این مشکل شده.

مورد مشکل اینه :

وقتی تاریخ در فیلد LockoutTime ذخیره میشه زمانش 4.5 ساعت به عقب برمیگرده(مطمعنم علتش تبدیل کردن زمان به معادل میلادیش باشه) و حتما کد های تابع SetLockoutEndDateAsync علت این مورد هست :

1 - شیوه دیگه ایه برای بروز کردن فیلد LockoutEndDateUtc  وجود داره ؟ یا میشه کد های تابع SetLockoutEndDateAsync  رو کاستومایز کرد ؟

2 - یا اینکه چطور میتونم قبل از ثبت تاریخ موجود در فیلد  model.LockoutTime فقط به زمان اون 4.5 ساعت اضافه کنم تا مشکل حل بشه ؟

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)