• 1401/06/18

null برگشتن claim در تابع لاگین :

با عرض خسته نباشید

استاد من برای نوشتن login سایت 

توی کنترلر موقع بررسی حالت ها : موقع sucess 

که بخواد لاگین کنه موقع رسیدن به خط های کد claim  در نهایت null بر میگردونه!؟

در حالی که توی خط بالاش که یه تابع نوشتم که یوزر با اون ایمیل رو پیدا کنه و برک پوینت هم می گذارم پیدا هم میکنه همون یوزر  ورودی رو 

ولی به محض اینکه به claim  میرسه null بر میگردونه . چرا؟

تابع لاگین هم بالاتر نوشتم و کار میکنه . بقیه حالت های switch - case  که نوشتم / not found/ error/notactive

همه کار میکنه برای sucess  که قراره بره به claim  نال بر میگردونه

  var user = await _userService.GetUserByEmail(loginUserViewModel.Email);

                            var claims = new List<Claim>()
                        {
                            new Claim(ClaimTypes.NameIdentifier,user.Id.ToString()),
                            new Claim(ClaimTypes.Email,user.Email),
                            new Claim(ClaimTypes.Name,user.FirstName)
                        };
                            var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
                            var principal = new ClaimsPrincipal(identity);

                            var properties = new AuthenticationProperties
                            {
                                IsPersistent = loginUserViewModel.RememberMe
                            };
                            TempData[SuccessMessage] ="موفق";
                            await HttpContext.SignInAsync(principal, properties);


                            return RedirectToAction("Index", "Home");
                        }

داحل فایل Setup  هم تنظیمات رو نوشتم :

         #region Authentication

            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                //options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;

            }).AddCookie(options =>
            {
                options.LoginPath = "/Login";
                options.LogoutPath = "/Logout";
                options.ExpireTimeSpan = TimeSpan.FromMinutes(43200);
                //for RememberMe 1 Month

            });

            #endregion

 

و

 

.
.
.
  app.UseHttpsRedirection();
            app.UseRouting();
            app.UseStaticFiles();
            app.UseAuthentication();
            app.UseAuthorization();
            app.UseCookiePolicy();
  • 1401/06/19
  • ساعت 01:47

سلام دوست من وقتتون بخیر

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


  • 1401/06/19
  • ساعت 18:02

2

 

استاد الان دوباره چک کردم توی سرویس ام میگیره ایمیل رو ولی وقتی به کنترلر میرسه به تابع GetUserByEmail

که میرسه null  بر میگردونه

    var user = await _userService.GetUserByEmail(loginUserViewModel.Email);

در حالیکه موقع تریس تو خط های بالا تر درست مدل رو گرفته ایمیل و... را ( توی ورودی بالاتر تابع لاگین)

 

[HttpPost]
        public async Task<IActionResult> Login(LoginUserViewModel loginUserViewModel)
        {
            if (ModelState.IsValid)
            {
                var result = await _userService.LoginUser(loginUserViewModel);

                switch (result)
                {
                    case LoginUserResult.Error:
                        {
                            ModelState.AddModelError("Email", "خطا داد");
                            break;
                        }

                    case LoginUserResult.NotActive:
                        {
                            ModelState.AddModelError("Email", "کاریر فعال نیست  ");
                            break;
                        }
                    case LoginUserResult.UserNotFound:
                        {
                            ModelState.AddModelError("Email", "کاربر پیدا نشد");
                            break;

                        }
                    case LoginUserResult.Success:

                        {
                          
                            ViewBag.IsSuccess = true;

                            var user = await _userService.GetUserByEmail(loginUserViewModel.Email);

                            var claims = new List<Claim>()
                            {
                                new Claim(ClaimTypes.NameIdentifier,user.Id.ToString()),
                                new Claim(ClaimTypes.Email,user.Email),
                                new Claim(ClaimTypes.Name,user.FirstName)
                            };
                            var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
                            var principal = new ClaimsPrincipal(identity);

                            var properties = new AuthenticationProperties
                            {
                                IsPersistent = loginUserViewModel.RememberMe
                            };
                            TempData[SuccessMessage] = "موفق";
                            await HttpContext.SignInAsync(principal, properties);
                            break;
                            
                        }
                }
            }

            return View(loginUserViewModel);
        }

 

به همین ترتیب عکس در تریس ببینید:

1)

 

 

 2)

3)

 

4)


  • 1401/06/20
  • ساعت 08:17

دوست من لطفا کد های دوتا متدی که گفتید رو باهم بررسی کنید ببینید متدی که یوزر رو پیدا میکنه برای ایمیل از ToLowerCase استفاده کرده یا نه

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


  • 1401/06/20
  • ساعت 11:23

سلام 

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


  • 1401/06/21
  • ساعت 13:05

اینا رو به این ترتیب کردم

   app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();
            app.UseRouting();
            app.UseAuthentication();
            app.UseAuthorization();

این تابع رو اشتباه نوشته بودم:

u => u.Mobile== email

ولی با این حال ایمیل رو چرا میداد پس : دی

درستش کردم به :


public async Task<User> GetUserByEmail(string email)
        {
            return await _context.Users.SingleOrDefaultAsync(u => u.Email == email);
        }

توی کنترلر هم اول گرفتمش:

    var email = loginUserViewModel.Email;
                            var user = await _userService.GetUserByEmail(email);

بعد دیگه وارد claim شد و درست شد گویا


  • 1401/06/21
  • ساعت 18:26

خدا رو شکر موفق باشی رفیق


  • 1401/06/21
  • ساعت 19:54

خوشحالم مشکل رو متوجه شدین دوست من 

ممنون بابت به اشتراک گذاری راه حل 

موفق باشید دوست عزیز


logo-enamadlogo-samandehi