почему повторно не срабатывает Аутентификация через Google на ASP.NET MVC
В чём дело? Когда я вхожу в аккаунт Гугл первый раз, всё срабатывает отлично, когда я выхожу и вхожу заново в тот же аккаунт, то ничего не срабатывает вообще, меня просто возвращает на ту же страницу входа
Вот целый скрипт Контроллера который отвечает за всю аутификацию и авторизацию
public class AccountController : Controller
{
public SignInManager<ApplicationUser> _signInManager { get; }
public UserManager<ApplicationUser> _userManager { get; }
public AccountController(SignInManager<ApplicationUser> signInManager, UserManager<ApplicationUser> userManager)
{
_signInManager = signInManager;
_userManager = userManager;
}
[AllowAnonymous]
public async Task<IActionResult> Login(string returnUrl)
{
var model = new LoginViewModel()
{
ReturnUrl = returnUrl,
ExternalLogin = await _signInManager.GetExternalAuthenticationSchemesAsync(),
};
return View(model);
}
public IActionResult Index()
{
ViewBag.UserName = User.Identity.Name;
return View();
}
[AllowAnonymous]
[HttpPost]
public async Task<IActionResult> Login(LoginViewModel model)
{
if(!ModelState.IsValid)
return View(model);
var user = await _userManager.FindByNameAsync(model.UserName);
if (user == null)
{
ModelState.AddModelError("", "UserNotFound");
return View(model);
}
var result = await _signInManager.PasswordSignInAsync(user, model.Password, true, false);
if (result.Succeeded)
{
return Redirect(model.ReturnUrl);
}
return View(model);
}
public IActionResult LogOff()
{
_signInManager.SignOutAsync();
return Redirect("/home/index");
}
[HttpPost]
[AllowAnonymous]
public IActionResult ExternalLogin(string provider, string returnUrl = null)
{
var redirectUrl = Url.Action(nameof(ExternalLoginCallback), null, new { returnUrl });
var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
return Challenge(properties, provider);
}
[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null)
{
var info = await _signInManager.GetExternalLoginInfoAsync();
if (info == null)
{
return this.Redirect("/Login");
}
var email = info.Principal.FindFirstValue(ClaimTypes.Email);
var name = info.Principal.FindFirstValue(ClaimTypes.Name) ?? info.Principal.Identity.Name;
var user = new ApplicationUser(name);
user.Email = email;
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, false, false);
if (result.Succeeded)
{
return RedirectToAction("Index");
}
return RedirectToAction("RegisterExternal", new ExternalLoginViewModel()
{
ReturnUrl = returnUrl,
UserName = info.Principal.FindFirstValue(ClaimTypes.Name)
});
}
[AllowAnonymous]
public IActionResult RegisterExternal(ExternalLoginViewModel model)
{
return View(model);
}
[HttpPost]
[AllowAnonymous]
[ActionName("RegisterExternal")]
public async Task<IActionResult> RegisterExternalConfirmed(ExternalLoginViewModel model)
{
var info = await _signInManager.GetExternalLoginInfoAsync();
if (info == null)
{
return RedirectToAction("Login");
}
var user = new ApplicationUser(model.UserName);
user.Email = info.Principal.FindFirstValue(ClaimTypes.Email);
var result = await _userManager.CreateAsync(user);
if (result.Succeeded)
{
var claimsResult = await _userManager.AddClaimAsync(user, new Claim(ClaimTypes.Role, "Administrator"));
if (claimsResult.Succeeded)
{
var identityResult = await _userManager.AddLoginAsync(user, info);
if (identityResult.Succeeded)
{
await _signInManager.SignInAsync(user, false);
return RedirectToAction("Index");
}
}
}
return View(model);
}
}
Views/Account/ExternalRegister.cshtml
@model ExternalLoginViewModel
<h1>External Register</h1>
<form asp-controller="Admin" asp-action="RegisterExternal" method="post">
@*<div asp-validation-summary="All"></div>*@
<input hidden asp-for="ReturnUrl" />
<div>
<label>UserName</label>
<input asp-for="UserName" />
<span asp-validation-for="UserName"></span>
</div>
<p><button type="submit">Save</button></p>
</form>
Views/Account/Login.cshtml
@model LoginViewModel
<h1>Login</h1>
<form method="post" asp-action="ExternalLogin" asp-controller="Account">
@foreach (var item in Model.ExternalLogin)
{
<button type="submit" value="@item.Name" name="provider">@item.DisplayName</button>
}
</form>
(Про вход второй раз) Вроде строка логина есть
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, false, false);
И result в этот момент равняется Succeeded , но всё равно в аккаунт он не входит, не понимаю в чём беда то