如何使用 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")]
我在我的 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")]