Blazor Server + Identity: SigninManager.SigninAsync не сохраняет логин (cookie не установлен)C#

Место общения программистов C#
Ответить
Anonymous
 Blazor Server + Identity: SigninManager.SigninAsync не сохраняет логин (cookie не установлен)

Сообщение Anonymous »

Я строю приложение Blazor Server (.net 9, Identity + Entity Framework Core + Mudblazor). У меня есть пользовательская форма входа в систему, и я хочу аутентифицировать пользователя вручную, используя SignInManager .
Я использую этот метод для входа в систему:

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

private async Task RegoLogin()
{
isBusy = true;
LoginResultRego = true;

try
{
// Try to find the user by email or username
ApplicationUser user = RegoBenutzer.Contains('@')
? await UserManager.FindByEmailAsync(RegoBenutzer)
: await UserManager.FindByNameAsync(RegoBenutzer);

if (user == null)
{
Console.WriteLine("❌ User does not exist.");
LoginResultRego = false;
return;
}

// Step 1: Check if the password is valid (does NOT create authentication cookie)
var result = await SignInManager.CheckPasswordSignInAsync(user, RegoKennwort, lockoutOnFailure: false);

if (result.Succeeded)
{
// Step 2: Perform the actual sign-in (this creates the auth cookie)
await SignInManager.SignInAsync(user, isPersistent: false);

// Step 3: Optionally store user in shared state (if needed)
SharedDataService.LoggedInUser = user;

// Step 4: Conditional redirect
if (user.MustChangePassword)
{
Navigation.NavigateTo("/change-password", forceLoad: true);
}
else
{
Navigation.NavigateTo("/dashboard", forceLoad: true);
}
}
else
{
Console.WriteLine("❌ Invalid login attempt.");
Console.WriteLine($"🔎 Details: IsLockedOut={result.IsLockedOut}, IsNotAllowed={result.IsNotAllowed}, Requires2FA={result.RequiresTwoFactor}");
LoginResultRego = false;
}
}
catch (Exception ex)
{
Console.WriteLine($"❌ Exception occurred during login: {ex.Message}");
LoginResultRego = false;
}
finally
{
isBusy = false;
}
}
✅ CheckPassWordSignInasync () возвращает effered = true , поэтому учетные данные действительны. Страница. Похоже, что в браке не записано ни одно авто, то что я пробовал:
  • обеспечить useauthentication () и useauthorization () в правильном порядке в программе. RevalidatingIdentityAuthenticationStateProvider
  • Параметры cookie устанавливаются через ConfigureApplicationCookie , чтобы иметь/как путь входа в систему.
  • Проверено, что пользователь. PasswordSignInasync (...) вместо этого - та же проблема.
Вопросы
  • Почему не значит, что нет signasync (пользователь, iSpersistent: false) with? Специальное требование использования его внутри компонентов сервера Blazor? 9
  • Blazor Server (не веб -сборка)
  • Ядро структуры предприятия с Postgresql
  • Identity: Addientity ()
hier - это программа.

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

    public static async Task Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);

// MudBlazor
builder.Services.AddMudServices();
builder.Services.AddScoped();

// Razor i Blazor
builder.Services.AddRazorComponents().AddInteractiveServerComponents();
builder.Services.AddServerSideBlazor().AddCircuitOptions(options =>
{
options.DetailedErrors = true;
});

builder.Services.AddHttpClient();

// DBContext
builder.Services.AddDbContext(options =>
options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")));

// Identity
builder.Services.AddIdentity(options =>
{
options.Password.RequireDigit = false;
options.Password.RequiredLength = 8;
options.Password.RequireLowercase = false;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;

options.SignIn.RequireConfirmedAccount = false;
options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedPhoneNumber = false;
})
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
builder.Services.AddHttpContextAccessor();
builder.Services.AddAuthorization();
builder.Services.AddScoped();
builder.Services.AddRazorComponents();
builder.Services.AddRazorPages();

builder.Services.ConfigureApplicationCookie(options =>
{
options.LoginPath = "/";
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}

app.UseHttpsRedirection();

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();

app.UseAntiforgery();

app.MapStaticAssets();
app.MapRazorPages();
app.MapRazorComponents()
.AddInteractiveServerRenderMode();

using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;

var roleManager = services.GetRequiredService();
var userManager = services.GetRequiredService();

string[] roles = { "SuperAdmin", "CompanyAdmin", "User"  };

foreach (var role in roles)
{
if (!await roleManager.RoleExistsAsync(role))
{
await roleManager.CreateAsync(new IdentityRole(role));
}
}

await SeedTestUser(services);
}

await app.RunAsync();
}

public static async Task SeedTestUser(IServiceProvider services)
{
var userManager = services.GetRequiredService();
var roleManager = services.GetRequiredService();

string userName = "admin2";
string email = "admin2@rego.local";
string password = "Admin123!";
string roleName = "SuperAdmin";

if (!await roleManager.RoleExistsAsync(roleName))
{
await roleManager.CreateAsync(new IdentityRole(roleName));
}

var existingUser = await userManager.FindByNameAsync(userName);
if (existingUser != null)
{
var deleteResult = await userManager.DeleteAsync(existingUser);
if (!deleteResult.Succeeded)
{
Console.WriteLine("❌ Nie udało się usunąć starego użytkownika:");
foreach (var e in deleteResult.Errors)
Console.WriteLine($" - {e.Description}");
return;
}
else
{
Console.WriteLine("ℹ️ Usunięto poprzedniego użytkownika admin2.");
}
}

var user = new ApplicationUser
{
UserName = userName,
Email = email,
EmailConfirmed = true,
PhoneNumberConfirmed = true,
LockoutEnabled = false,
MustChangePassword = true,
IsInitialAdmin = false,
CompanyId = null
};

var result = await userManager.CreateAsync(user, password);
if (result.Succeeded)
{
await userManager.AddToRoleAsync(user, roleName);
Console.WriteLine("✅ Nowy użytkownik admin2 został utworzony i przypisany do roli SuperAdmin.");
}
else
{
Console.WriteLine("❌ Błąd przy tworzeniu użytkownika:");
foreach (var e in result.Errors)
Console.WriteLine($" - {e.Description}");
}
}
Спасибо за вашу помощь!

Подробнее здесь: https://stackoverflow.com/questions/797 ... ogin-cooki
Ответить

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

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

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

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

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