Пользовательская ошибка AuthenticationStateProviderService в localstorageC#

Место общения программистов C#
Ответить
Anonymous
 Пользовательская ошибка AuthenticationStateProviderService в localstorage

Сообщение Anonymous »

У меня есть CustomAuthenticationStateProviderService. Сначала я использовал константу для хранения JWTToken, но теперь хочу переключиться на использование локального хранилища.

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

public class Constants
{
public static string JWTToken { get; set; } = "";
}

public class CustomAuthenticationStateProviderService : AuthenticationStateProvider
{
private readonly ClaimsPrincipal anonymous = new(new ClaimsIdentity());
private readonly ProtectedLocalStorage localStorage;

public CustomAuthenticationStateProviderService(ProtectedLocalStorage localStorage)
{
this.localStorage = localStorage;
}

public async override Task GetAuthenticationStateAsync()
{
try
{
var token = await localStorage.GetAsync("headerToken");

if (string.IsNullOrWhiteSpace(Constants.JWTToken))
return await Task.FromResult(new AuthenticationState(anonymous));

var claims = JWTService.DecryptToken(Constants.JWTToken);
if (claims == null) return await Task.FromResult(new AuthenticationState(anonymous));

var claimsPrincipal = SetClaimPrincipal(claims);
return await Task.FromResult(new AuthenticationState(claimsPrincipal));
}
catch (Exception ex)
{
return await Task.FromResult(new AuthenticationState(anonymous));
}
}
}
У меня есть и другие методы внутри класса, но это единственный, с которым я пока начал использовать localstorage. Ошибка выдается еще до того, как она попадает на первую страницу приложения, которая

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

'JavaScript interop calls cannot be issued at this time. This is because the component is being statically rendered. When prerendering is enabled, JavaScript interop calls can only be performed during the OnAfterRenderAsync lifecycle method.'
Я понимаю, что он хочет, чтобы я использовал метод OnAfterRenderAsync, но это происходит еще до того, как он перейдет на любую из моих страниц, так что это не поможет. Кроме того, мне нужно, чтобы он использовался в OnInitialized по логической причине, поэтому мои страницы используют @rendermode @(new InteractiveServerRenderMode(false))
Я окружил локальное хранилище get с помощью try catch, который исправляет. Я нашел ответ, в котором говорится, что такое поведение вызвано builder.Services.AddCascadingAuthenticationState();, который у меня есть в program.cs

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

try
{
var token = await localStorage.GetAsync("headerToken");
}
catch (InvalidOperationException)
{
}
Это устраняет первую проблему, но затем появляется новая ошибка:

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

JavaScript interop calls cannot be issued at this time. This is because the circuit has disconnected and is being disposed.
Как исправить эти ошибки, чтобы локальное хранилище работало должным образом?

Подробнее здесь: https://stackoverflow.com/questions/780 ... calstorage
Ответить

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

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

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

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

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