我有一个使用 .NET core 3.1 的 Blazor 服务器端应用程序。它用于Microsoft.AspNetCore.Authentication.Negotiate
通过 Windows Credentials/Active Directory 对用户进行身份验证。
我遇到的问题是如何注销用户。经过各种研究,我发现某些外部身份验证方法不支持注销。例如,Windows/AD 不需要显式注销。您唯一需要做的就是在应用程序中本地清洁身份和声明原则。这就是我遇到的麻烦。当您关闭浏览器时,用户也会自动注销。
我正在使用此中间件使用 Negotiate 进行身份验证,并尝试在注销期间清除用户的声明。但它不起作用。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Authentication;
namespace Test.Middleware
{
internal class ValidateAuthentication : IMiddleware
{
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
try
{
if (context.User.Identity.IsAuthenticated)
{
await next(context);
}
else
{
await context.ChallengeAsync("Negotiate");
}
}
catch(InvalidOperationException) // this is for Windows/Negotiate sign out
{
context.User = new System.Security.Claims.ClaimsPrincipal();
}
}
}
}
这是我的服务配置
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddElasticsearch(Configuration);
services.AddHttpContextAccessor();
services.AddScoped<ValidateAuthentication>();
services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate();
}
预期结果是用户退出。但实际结果是用户保持登录状态。