Reputation: 131
I created a Blazor WebAssembly app and when clicking on the logout link /authentication/logout
I get redirected to /authentication/logout-failed?message=The%20logout%20was%20not%20initiated%20from%20within%20the%20page.
with the message:
There was an error trying to log you out: ''
I'm using IdentityServer4.
How can I perform a proper logout and that I'm also logged out of the service providers (Facebook, Google and/or 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");
});
}
Upvotes: 3
Views: 5476
Reputation: 131
In the meanwhile I found the solution. In stead of directly linking to /authentication/logout/
I use the @onclick="BeginSignOut"
on the logout link/button.
Then you need to inject:
[Inject] NavigationManager Navigation { get; set; }
[Inject] SignOutSessionStateManager SignOutManager { get; set; }
and use it in:
protected async Task BeginSignOut(MouseEventArgs args)
{
await SignOutManager.SetSignOutState();
Navigation.NavigateTo("authentication/logout");
}
Upvotes: 8