当前,我使用以下代码将Azure Active Directory集成到我的.NET Web API中:
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Audience = WebConfigurationManager.AppSettings["AzureClientId"],
Tenant = WebConfigurationManager.AppSettings["AzureTenant"]
}
});
在web.config文件中设置了受众和租户。
我可以正确获取令牌,用户可以使用其Azure AD帐户登录。
但是,我将受众和租户移至数据库中,以允许用户更改设置并禁用/启用UI的Azure登录,而不是更改Web.config中的设置。
以上代码更改为:
var azureSetting = db.GetAzureSetting();
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Audience = azureSetting.AzureClientId,
Tenant = azureSetting.AzureTenant
}
});
应用程序首次启动时,数据库中没有配置,因为用户尚未输入配置。然后,用户转到Azure配置屏幕,输入正确的客户端ID,租户,客户端秘密。但是用户无法使用Azure AD用户登录。
谁能为我解释这个案例?
有什么方法可以将Azure配置保存在DB而不是Web.config?
您的帖子中的代码在Web API启动时可以正常工作,并且我们无法更改配置运行时,如果您想启用用户动态地更改受众和租户,则可以自己处理令牌验证。您可以使用JWTSecurityTokenHandler在API应用程序获取访问令牌后验证令牌,以下代码为您的参考:
public JwtSecurityToken Validate(string token)
{
string stsDiscoveryEndpoint = "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration";
ConfigurationManager<OpenIdConnectConfiguration> configManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint);
OpenIdConnectConfiguration config = configManager.GetConfigurationAsync().Result;
TokenValidationParameters validationParameters = new TokenValidationParameters
{
ValidateAudience = true,
ValidateIssuer = false,
ValidAudience = "https://testbasic1.onmicrosoft.com/TodoListService", //your value from database
IssuerSigningTokens = config.SigningTokens,
ValidateLifetime = false
};
JwtSecurityTokenHandler tokendHandler = new JwtSecurityTokenHandler();
SecurityToken jwt;
var result = tokendHandler.ValidateToken(token, validationParameters, out jwt);
return jwt as JwtSecurityToken;
}
此处理程序可帮助您验证令牌的签名,以确保令牌由Azure Active Directory发行,并根据业务逻辑验证令牌中的索赔,在您的情况下,您需要确认受众和租户。
在您的Web API应用中,您可以在global.asax中注册自定义TokenValidationHandler:
GlobalConfiguration.Configuration.MessageHandlers.Add(new TokenValidationHandler());
您可以单击此处以获取代码示例,您可以修改代码以检查令牌是否来自存储在数据库中的租户ID。