#c# #identityserver4 #logout #webassembly #blazor-webassembly
#c# #identityserver4 #Выход #webassembly #blazor-webassembly
Вопрос:
Я создал приложение Blazor WebAssembly, и при нажатии на ссылку для выхода /authentication/logout
из системы я перенаправляюсь /authentication/logout-failed?message=The logout was not initiated from within the page.
с сообщением:
Произошла ошибка при попытке выхода из системы: «
Я использую IdentityServer4.
Как я могу выполнить правильный выход из системы и что я также вышел из системы поставщиков услуг (Facebook, Google и / или Microsoft)?
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddAuthentication()
.AddFacebook(facebookOptions =>
{
facebookOptions.ClientId = Configuration["Authentication:Facebook:ClientId"];
facebookOptions.ClientSecret = Configuration["Authentication:Facebook:ClientSecret"];
})
.AddGoogle(googleOptions =>
{
googleOptions.ClientId = Configuration["Authentication:Google:ClientId"];
googleOptions.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
})
.AddMicrosoftAccount(microsoftOptions =>
{
microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ClientId"];
microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
});
services.Configure<IdentityOptions>(options =>
options.ClaimsIdentity.UserIdClaimType = ClaimTypes.NameIdentifier);
services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, ApplicationDbContext>();
services.AddAuthentication()
.AddIdentityServerJwt();
services.AddControllersWithViews();
services.AddRazorPages();
services.AddOptions();
services.AddAutoMapper(typeof(Startup));
services.AddTransient<IEmailSender, EmailSender>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
app.UseWebAssemblyDebugging();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseBlazorFrameworkFiles();
app.UseStaticFiles();
app.UseRouting();
app.UseIdentityServer();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
endpoints.MapFallbackToFile("index.html");
});
}
Ответ №1:
Тем временем я нашел решение. Вместо прямой ссылки на /authentication/logout/
я использую @onclick="BeginSignOut"
ссылку / кнопку для выхода из системы.
Затем вам нужно ввести:
[Inject] NavigationManager Navigation { get; set; }
[Inject] SignOutSessionStateManager SignOutManager { get; set; }
и используйте его в:
protected async Task BeginSignOut(MouseEventArgs args)
{
await SignOutManager.SetSignOutState();
Navigation.NavigateTo("authentication/logout");
}
Комментарии:
1. Хотя это уже было в шаблоне, я все равно получаю исходную ошибку.
2. SignOutSessionStateManager устарел, используйте Microsoft. AspNetCore. Компоненты. WebAssembly. Аутентификация. NavigationManagerExtensions. NavigateToLogout (навигация, «аутентификация / выход»);