Blazor WebAssembly 应用 /authentication/logout 导致 "There was an error trying to log you out: ''" 失败
Blazor WebAssembly app /authentication/logout results in "There was an error trying to log you out: ''" fail
我创建了一个 Blazor WebAssembly 应用程序,当单击注销 link /authentication/logout
我被重定向到 /authentication/logout-failed?message=The%20logout%20was%20not%20initiated%20from%20within%20the%20page.
并显示以下消息:
There was an error trying to log you out: ''
我正在使用 IdentityServer4。
如何执行正确的注销并且我也从服务提供商(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");
});
}
同时我找到了解决办法。我没有直接链接到 /authentication/logout/
,而是在注销时使用 @onclick="BeginSignOut"
link/button。
然后需要注入:
[Inject] NavigationManager Navigation { get; set; }
[Inject] SignOutSessionStateManager SignOutManager { get; set; }
并将其用于:
protected async Task BeginSignOut(MouseEventArgs args)
{
await SignOutManager.SetSignOutState();
Navigation.NavigateTo("authentication/logout");
}
我创建了一个 Blazor WebAssembly 应用程序,当单击注销 link /authentication/logout
我被重定向到 /authentication/logout-failed?message=The%20logout%20was%20not%20initiated%20from%20within%20the%20page.
并显示以下消息:
There was an error trying to log you out: ''
我正在使用 IdentityServer4。
如何执行正确的注销并且我也从服务提供商(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");
});
}
同时我找到了解决办法。我没有直接链接到 /authentication/logout/
,而是在注销时使用 @onclick="BeginSignOut"
link/button。
然后需要注入:
[Inject] NavigationManager Navigation { get; set; }
[Inject] SignOutSessionStateManager SignOutManager { get; set; }
并将其用于:
protected async Task BeginSignOut(MouseEventArgs args)
{
await SignOutManager.SetSignOutState();
Navigation.NavigateTo("authentication/logout");
}