0

我有一个使用 .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();
}

预期结果是用户退出。但实际结果是用户保持登录状态。

4

0 回答 0