Blazor WebAssembly: не удалось переместить код шаблона аутентификации и авторизацииC#

Место общения программистов C#
Ответить
Anonymous
 Blazor WebAssembly: не удалось переместить код шаблона аутентификации и авторизации

Сообщение 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();


Подробнее здесь: https://stackoverflow.com/questions/785 ... ode-failed
Ответить

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

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

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

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

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