如何使用 Azure AD 在 WPF 应用程序中验证 Web api

How to authenticate web api in WPF app using Azure AD

我在我的 WPF 应用程序中使用此代码:

 var app = PublicClientApplicationBuilder.Create(_clientId)                                                
   .WithRedirectUri("http://localhost/")                                                  
   .WithAuthority(AzureCloudInstance.AzurePublic, _tenantId).Build();

 try
        {
            result = await app.AcquireTokenInteractive(scopes).ExecuteAsync();

        }
        catch (MsalUiRequiredException)
        {
            return Result<UserMetadata>.NotAuthorized("There was on error");
        }

而且效果很好。现在我可以调用我的 WEB API 并将“Bearer token”header 发送到所有端点。 (令牌是 access_token 属性 我从结果中得到)

在网络中 api 我只是这样做:

 _ = services.AddMicrosoftIdentityWebApiAuthentication(Configuration);

而且有效。

但是,我不希望所有端点都受到此方法的保护(我有其他身份验证机制) 我的想法是在客户端以某种方式获取“代码”变量(在浏览器 window 上设置的 on,但不幸的是结果没有在我的 C# 代码中返回),将其发送到服务器并在特定控制器内部尝试“登录” " 用户(从该代码中获取 access_token)

原因是我已经有了自己的基于数据库中用户 table 的身份验证机制。

如果我理解正确,您只想使用 AD 保护选定的 API 个端点。您当然可以通过如下设置 Startup.cs 来做到这一点:

services.AddAuthentication(options =>
              {
                  options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
              })
                .AddJwtBearer("AAD", jwtOptions =>
                {
                    jwtOptions.Authority = $"{appConfiguration.AppSettings.AadInstance}/{appConfiguration.AppSettings.AadDomain}";
                    jwtOptions.Audience = appConfiguration.AppSettings.AadClientId;
                    jwtOptions.Events = new JwtBearerEvents
                    {
                        OnAuthenticationFailed = arg =>
                        {
                            // invoked if authentication fails
                            return Task.FromResult(0);
                        }
                    };
                    
                });
            
            services.AddAuthorization(options => 
            {
                options.DefaultPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().AddAuthenticationSchemes("AAD").Build();

                options.AddPolicy("AAD", new AuthorizationPolicyBuilder().RequireAuthenticatedUser().AddAuthenticationSchemes("AAD").Build());
            });

然后,将属性添加到所需的 Controller/Action 方法以进行保护,如下所示:

[Authorize(Policy = "AAD")]