Реализация внешнего входа не устанавливает для IsAuthenticated значение true, пока я не обновлю страницу.C#

Место общения программистов C#
Ответить
Anonymous
 Реализация внешнего входа не устанавливает для IsAuthenticated значение true, пока я не обновлю страницу.

Сообщение Anonymous »

Я реализовал внешний вход в свое веб-приложение NET Core 8.
Это метод обратного вызова:

Код: Выделить всё

[AllowAnonymous]
[HttpGet("ExternalLoginCallback")]
public async Task ExternalLoginCallback(string? returnUrl = null, string? remoteError = null)
{
returnUrl ??= Url.Content("~/");

LoginViewModel loginViewModel = new ()
{
ReturnUrl = returnUrl,
ExternalLogins = (await signInManager.GetExternalAuthenticationSchemesAsync()).ToList()
};

if (remoteError != null)
{
ModelState
.AddModelError(string.Empty, $"Error desde el proveedor externo: {remoteError}");

loginViewModel.SetError(remoteError);

return View("Login", loginViewModel);
}

// Get the login information about the user from the external login provider
var info = await signInManager.GetExternalLoginInfoAsync();
if (info == null)
{
ModelState
.AddModelError(string.Empty, "Error al cargar la información del login externo.");

loginViewModel.SetError("Error al cargar la información del login externo.");

return View("Login", loginViewModel);
}

// If the user already has a login (i.e if there is a record in AspNetUserLogins
// table) then sign-in the user with this external login provider
var signInResult = await signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);

var userName = info.Principal.FindFirstValue(ClaimTypes.Email);

if (signInResult.Succeeded)
{
if (userName != null)
{
await SetLastLoggedOnTime(userName);
var user = await userManager.FindByNameAsync(userName);
if (user != null)
await userManager.UpdateSecurityStampAsync(user);
}

return LocalRedirect(returnUrl);
}
else
{
// Verifica que el usuario exista. Si existe, agrega el login y autentica
var creado = userName == null ? null : await usuarioService.CreateUserFromExternal(userName, info);
if (creado != null)
{
await userManager.AddLoginAsync(creado, info);
await signInManager.SignInAsync(creado, isPersistent: false);
if (userName != null)
await SetLastLoggedOnTime(userName);

return LocalRedirect(returnUrl);
}
else
{
loginViewModel.Notification = new Integration.ViewModels.MessageViewModel
{
Type = Integration.ViewModels.AlertTypes.Danger
};
if (signInResult.IsLockedOut)
loginViewModel.SetError("El usuario está bloqueado.");
else if (signInResult.IsNotAllowed)
loginViewModel.SetError("El usuario no está autorizado para ingresar.");
else
loginViewModel.SetError("El usuario no está registrado en la plataforma.");
}
}

return View("Login", loginViewModel);
}
Когда пользователь входит в систему, LocalRedirect(returnUrl) перенаправляет на защищенную страницу. Эта целевая страница считает, что пользователь не аутентифицирован (

Код: Выделить всё

IsAuthenticatedСвойство 
имеет значение false), поэтому система перенаправляет обратно на страницу входа. Если я сразу установлю URL-адрес браузера на защищенную страницу, не пытаясь снова войти в систему, IsAuthenticated станет истинным, и страница отобразится.
Что здесь не так?
Что здесь не так? p>
Обратите внимание: когда я вижу объект info после внешней аутентификации, IsAuthenticated отображается как true.
Изображение

А также User.Identity.IsAuthenticated:
Изображение

Только при выполнении перенаправления тот целевая страница имеет User.Identity.IsAuthenticated = false
У меня есть этот код в пользовательском атрибуте AuthorizeAttribute. На этом этапе я вижу, что свойство неверно:
Изображение

Как я уже сказал, если я изменю URL-адрес браузера на защищенную страницу, результат будет следующий:
Изображение


Подробнее здесь: https://stackoverflow.com/questions/792 ... s-i-refres
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»