如何在 ASP.NET Core 5 Web API 中支持 Windows 身份验证和 OpenId?

问题描述

我有一个 Web API,目前支持开箱即用的 Windows 身份验证。在我的 Startup.cs 中,我只有:

services.AddAuthentication();
services.AddAuthorization();

和:

app.UseAuthentication();
app.UseAuthorization();

目前就这些。 Windows 和匿名身份验证均已启用,并且所有控制器都具有 [Authorize],除非需要匿名。大多数控制器都有 CRUD 操作,每个操作都有一个自定义过滤器,用于检查数据库是否允许用户执行操作。

此 API 提供 Winforms 桌面应用程序,用户使用其域帐户登录。所以目前我在每个请求上传递他们的网络凭据,以及一个额外的令牌,我用来与他们的数据库用户权限进行比较。

现在我需要添加额外的身份验证方案,从 OpenId 开始。我已经有第二个应用程序可以从身份验证服务器获取访问令牌。

我已经开始使用以下方法,但它不起作用:

services.AddAuthentication()
    .AddNegotiate(IISDefaults.AuthenticationScheme,options =>
    {

    })
    .AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme,options =>
    {
        options.Authority = Configuration["Issuer"];
        options.ClientId = Configuration["ClientId"];
        options.ClientSecret = Configuration["ClientSecret"];
        options.TokenValidationParameters = new TokenValidationParameters {
            ValidateIssuer = true,IssuerSigningKey = new SymmetricSecurityKey(Convert.FromBase64String(Configuration["EncryptionKey"]))
        };
    });

services.AddAuthorization(options =>
{
    var builder = new AuthorizationPolicyBuilder(
        IISDefaults.AuthenticationScheme,OpenIdConnectDefaults.AuthenticationScheme
    );
    builder.RequireAuthenticatedUser();

    options.DefaultPolicy = builder.Build();
});

我错过了什么?

解决方法

您的默认身份验证架构在哪里?

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

}).AddJwtBearer(o => ...