با عرض خسته نباشید
استاد من برای نوشتن 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();سلام دوست من وقتتون بخیر
دوست من چک کنید که ایمیل ها دقیقا یکسان هست یا نه مثلا از نظر حروف بزرگ کوچیک باهم دیگه متفاوت نباشند
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)

دوست من لطفا کد های دوتا متدی که گفتید رو باهم بررسی کنید ببینید متدی که یوزر رو پیدا میکنه برای ایمیل از ToLowerCase استفاده کرده یا نه
همچنین لطفا کد های دوتا متد گفته شده رو هم ارسال کنید تا بررسی بشه
سلام
در بخش استارت آپ برنامه عکس از ترتیب میدلویرها بگیر دقیقا مشکل اونجاست برای من پیش اومد
اینا رو به این ترتیب کردم
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 شد و درست شد گویا
خدا رو شکر موفق باشی رفیق
خوشحالم مشکل رو متوجه شدین دوست من
ممنون بابت به اشتراک گذاری راه حل
موفق باشید دوست عزیز