У меня есть приложение Blazor WASM. Я использую Identity Framework для входа в систему:
SignInResult signInResult = await signInManager<ApplicationUser>.PasswordSignInAsync(parameters.UserName, parameters.Password, parameters.RememberMe, true);
signInResult
всегда Succeeded
.
В StateProvider в WebAssembly я получаю объект UserInfo, который, помимо прочего, сообщает, что если пользователь аутентифицирован:
[HttpGet]
public UserInfoDto UserInfo()
{
return BuildUserInfo();
}
private UserInfoDto BuildUserInfo()
{
var userInfo = new UserInfoDto
{
IsAuthenticated = User.Identity.IsAuthenticated,
UserName = User.Identity.Name
};
foreach (var claim in User.Claims)
{
userInfo.ExposedClaims.Add(claim.Type, claim.Value);
}
if (userInfo.IsAuthenticated)
{
userInfo.Id = Guid.Parse(identityService.GetUserId(User));
}
return userInfo;
}
Здесь User.Identity.IsAuthenticated
всегда ложно. Я также проверил это сразу после PasswordSignInAsyn c, но там тоже самое.
Мой запуск настроен следующим образом:
services.AddIdentity<ApplicationUser, ApplicationIdentityRole>()
.AddEntityFrameworkStores<SupportToolContext>()
.AddDefaultTokenProviders();
services.Configure<IdentityOptions>(options =>
{
// Password settings
options.Password.RequireDigit = false;
options.Password.RequiredLength = MIN_PASSWORD_LENGTH;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
options.Password.RequireLowercase = false;
// Lockout settings
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(LOCKOUT_DURATION);
options.Lockout.MaxFailedAccessAttempts = MAX_TRIES_BEFORE_LOCKOUT;
options.Lockout.AllowedForNewUsers = true;
// Email Settings
options.User.RequireUniqueEmail = true;
options.SignIn.RequireConfirmedEmail = true;
});
// Configure LifeSpan of Identity email tokens
services.Configure<DataProtectionTokenProviderOptions>(options =>
{
options.TokenLifespan = TimeSpan.FromDays(3);
});
services.ConfigureApplicationCookie(options =>
{
options.Cookie.HttpOnly = false;
options.Events = new CookieAuthenticationEvents
{
OnRedirectToLogin = context =>
{
context.Response.StatusCode = UNAUTHORIZED_STATUS_CODE;
return Task.CompletedTask;
}
};
});
И метод Configure содержит:
app.UseAuthentication();
app.UseAuthorization();
AuthenticationStateProvider:
publi c class IdentityAuthenticationStateProvider: AuthenticationStateProvider {private UserInfoDto userInfoCache; только для чтения IServiceProvider serviceProvider;
public IdentityAuthenticationStateProvider(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}
..
private async Task<UserInfoDto> GetUserInfoAsync()
{
var authorizeApi = serviceProvider.GetRequiredService<IAuthorizeApi>();
if (userInfoCache != null && userInfoCache.IsAuthenticated) return userInfoCache;
userInfoCache = await authorizeApi.GetUserInfoAsync();
return userInfoCache;
}
public override async Task<AuthenticationState> GetAuthenticationStateAsync()
{
var identity = new ClaimsIdentity();
try
{
UserInfoDto userInfo = await GetUserInfoAsync();
if (userInfo.IsAuthenticated)
{
IEnumerable<Claim> claims = new[] {new Claim(ClaimTypes.Name, userInfoCache.UserName)}.Concat(
userInfoCache.ExposedClaims.Select(c => new Claim(c.Key, c.Value)));
identity = new ClaimsIdentity(claims, "Server authentication");
}
}
catch (HttpRequestException ex)
{
Console.WriteLine("Request failed:" + ex);
}
return new AuthenticationState(new ClaimsPrincipal(identity));
}
}
В целом весь процесс идентичен этому примеру: https://github.com/stavroskasidis/BlazorWithIdentity (который также перестал работать локально)
Что смущает Я имею в виду, что он работал раньше и до сих пор работает на сервере, и он не работает локально, если я извлекаю эту историю в точке, развернутой на сервере. Что мне не хватает?