Я перенес аутентификацию и авторизацию из шаблона удостоверения недавно обновленной Visual Studio в свое веб-приложение blazor webassembly (клиент-сервер). К сожалению, у меня возникали ошибки при завершении перемещения классов и других элементов кода.
Ниже приведен список того, что я сделал.
AccountController.cs: (отлаженный, вот все ок)
[HttpPost]
[Route("/api/account/login")]
public async Task Login([FromBody] LoginModel model)
{
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, false);
return result;
}
PersistingServerAuthenticationStateProvider.cs: (вообще не вводите сюда данные при входе в систему, это нормально?)
internal sealed class PersistingServerAuthenticationStateProvider : ServerAuthenticationStateProvider, IDisposable
{
private readonly PersistentComponentState state;
private readonly IdentityOptions options;
private readonly PersistingComponentStateSubscription subscription;
private Task? authenticationStateTask;
public PersistingServerAuthenticationStateProvider(
PersistentComponentState persistentComponentState,
IOptions optionsAccessor)
{
state = persistentComponentState;
options = optionsAccessor.Value;
AuthenticationStateChanged += OnAuthenticationStateChanged;
subscription = state.RegisterOnPersisting(OnPersistingAsync, RenderMode.InteractiveWebAssembly);
}
private void OnAuthenticationStateChanged(Task task)
{
authenticationStateTask = task;
}
private async Task OnPersistingAsync()
{
if (authenticationStateTask is null)
{
throw new UnreachableException($"Authentication state not set in {nameof(OnPersistingAsync)}().");
}
var authenticationState = await authenticationStateTask;
var principal = authenticationState.User;
if (principal.Identity?.IsAuthenticated == true)
{
var userId = principal.FindFirst(options.ClaimsIdentity.UserIdClaimType)?.Value;
var email = principal.FindFirst(options.ClaimsIdentity.EmailClaimType)?.Value;
if (userId != null && email != null)
{
state.PersistAsJson(nameof(UserInfo), new UserInfo
{
UserId = userId,
Email = email,
});
}
}
}
public void Dispose()
{
subscription.Dispose();
AuthenticationStateChanged -= OnAuthenticationStateChanged;
}
}
PersistentAuthenticationStateProvider (при аутентификации всегда пустой возврат, при доступе к страницам сайта необходима авторизация - не вводить этот метод класса):
public class PersistentAuthenticationStateProvider : AuthenticationStateProvider
{
private static readonly Task defaultUnauthenticatedTask =
Task.FromResult(new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity())));
private readonly Task authenticationStateTask = defaultUnauthenticatedTask;
public PersistentAuthenticationStateProvider(PersistentComponentState state)
{
if (!state.TryTakeFromJson(nameof(UserInfo), out var userInfo) || userInfo is null)
{
return; // always goes here
}
Claim[] claims = [
new Claim(ClaimTypes.NameIdentifier, userInfo.UserId),
new Claim(ClaimTypes.Name, userInfo.Email),
new Claim(ClaimTypes.Email, userInfo.Email) ];
authenticationStateTask = Task.FromResult(
new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity(claims,
authenticationType: nameof(PersistentAuthenticationStateProvider)))));
}
public override Task GetAuthenticationStateAsync() => authenticationStateTask;
}
Поставщик постоянства сервера зарегистрирован на сервере Program.cs, другой поставщик зарегистрирован на клиенте Program.cs. Несоответствие шаблонному проекту заключается в том, что представление Login.razor в моем проекте размещено на клиенте, а в созданном шаблоном - на сервере.
Ощущение, что я упускаю что-то простое - вот почему PersistingServerAuthenticationStateProvider вообще не захожу в отладчик.
Регистрационный код (клиент):
builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddSingleton();
Регистрационный код (сервер):
builder.Services.AddDbContext((options) =>
{
options.UseSqlServer(databaseConfig?.ConnectionString);
});
builder.Services.AddIdentityCore()//options => options.SignIn.RequireConfirmedAccount = true
.AddEntityFrameworkStores()
.AddSignInManager()
.AddDefaultTokenProviders();
builder.Services.AddScoped();
builder.Services.AddScoped();
Подробнее здесь: https://stackoverflow.com/questions/785 ... ode-failed
Blazor WebAssembly: не удалось переместить код шаблона аутентификации и авторизации ⇐ C#
Место общения программистов C#
1716972672
Anonymous
Я перенес аутентификацию и авторизацию из шаблона удостоверения недавно обновленной Visual Studio в свое веб-приложение blazor webassembly (клиент-сервер). К сожалению, у меня возникали ошибки при завершении перемещения классов и других элементов кода.
Ниже приведен список того, что я сделал.
AccountController.cs: (отлаженный, вот все ок)
[HttpPost]
[Route("/api/account/login")]
public async Task Login([FromBody] LoginModel model)
{
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, false);
return result;
}
PersistingServerAuthenticationStateProvider.cs: (вообще не вводите сюда данные при входе в систему, это нормально?)
internal sealed class PersistingServerAuthenticationStateProvider : ServerAuthenticationStateProvider, IDisposable
{
private readonly PersistentComponentState state;
private readonly IdentityOptions options;
private readonly PersistingComponentStateSubscription subscription;
private Task? authenticationStateTask;
public PersistingServerAuthenticationStateProvider(
PersistentComponentState persistentComponentState,
IOptions optionsAccessor)
{
state = persistentComponentState;
options = optionsAccessor.Value;
AuthenticationStateChanged += OnAuthenticationStateChanged;
subscription = state.RegisterOnPersisting(OnPersistingAsync, RenderMode.InteractiveWebAssembly);
}
private void OnAuthenticationStateChanged(Task task)
{
authenticationStateTask = task;
}
private async Task OnPersistingAsync()
{
if (authenticationStateTask is null)
{
throw new UnreachableException($"Authentication state not set in {nameof(OnPersistingAsync)}().");
}
var authenticationState = await authenticationStateTask;
var principal = authenticationState.User;
if (principal.Identity?.IsAuthenticated == true)
{
var userId = principal.FindFirst(options.ClaimsIdentity.UserIdClaimType)?.Value;
var email = principal.FindFirst(options.ClaimsIdentity.EmailClaimType)?.Value;
if (userId != null && email != null)
{
state.PersistAsJson(nameof(UserInfo), new UserInfo
{
UserId = userId,
Email = email,
});
}
}
}
public void Dispose()
{
subscription.Dispose();
AuthenticationStateChanged -= OnAuthenticationStateChanged;
}
}
PersistentAuthenticationStateProvider (при аутентификации всегда пустой возврат, при доступе к страницам сайта необходима авторизация - не вводить этот метод класса):
public class PersistentAuthenticationStateProvider : AuthenticationStateProvider
{
private static readonly Task defaultUnauthenticatedTask =
Task.FromResult(new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity())));
private readonly Task authenticationStateTask = defaultUnauthenticatedTask;
public PersistentAuthenticationStateProvider(PersistentComponentState state)
{
if (!state.TryTakeFromJson(nameof(UserInfo), out var userInfo) || userInfo is null)
{
return; // always goes here
}
Claim[] claims = [
new Claim(ClaimTypes.NameIdentifier, userInfo.UserId),
new Claim(ClaimTypes.Name, userInfo.Email),
new Claim(ClaimTypes.Email, userInfo.Email) ];
authenticationStateTask = Task.FromResult(
new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity(claims,
authenticationType: nameof(PersistentAuthenticationStateProvider)))));
}
public override Task GetAuthenticationStateAsync() => authenticationStateTask;
}
Поставщик постоянства сервера зарегистрирован на сервере Program.cs, другой поставщик зарегистрирован на клиенте Program.cs. Несоответствие шаблонному проекту заключается в том, что представление Login.razor в моем проекте размещено на клиенте, а в созданном шаблоном - на сервере.
Ощущение, что я упускаю что-то простое - вот почему PersistingServerAuthenticationStateProvider вообще не захожу в отладчик.
Регистрационный код (клиент):
builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddSingleton();
Регистрационный код (сервер):
builder.Services.AddDbContext((options) =>
{
options.UseSqlServer(databaseConfig?.ConnectionString);
});
builder.Services.AddIdentityCore()//options => options.SignIn.RequireConfirmedAccount = true
.AddEntityFrameworkStores()
.AddSignInManager()
.AddDefaultTokenProviders();
builder.Services.AddScoped();
builder.Services.AddScoped();
Подробнее здесь: [url]https://stackoverflow.com/questions/78548365/blazor-webassembly-move-authentication-and-authorization-templated-code-failed[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия