目前,我正在使用以下代码将Azure Active Directory集成到我的.NET Web API中:
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Audience = WebConfigurationManager.AppSettings["AzureClientId"],
Tenant = WebConfigurationManager.AppSettings["AzureTenant"]
}
});
观众和租户都设置在web.config文件中。
我可以正确获取令牌,用户可以使用他们的Azure帐户登录。
但是,我将受众和租户移动到数据库以允许用户更改设置并通过UI禁用/启用azure登录,而不是更改web.config中的设置。
以上代码更改为:
var azureSetting = db.GetAzureSetting();
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Audience = azureSetting.AzureClientId,
Tenant = azureSetting.AzureTenant
}
});
当应用程序首次启动时,数据库中没有配置,因为用户尚未输入配置。然后用户进入azure配置屏幕,输入正确的客户端ID,租户,客户端密钥。但是用户无法使用azure AD用户登录。
任何人都可以为我解释这个案子吗?
有没有办法在db而不是web.config中保存azure配置?
答案 0 :(得分:0)
当Web API启动时,帖子中的代码可以正常工作,我们无法更改配置运行时,如果您想让用户动态更改受众和租户,您可以自己处理令牌验证。在api应用获取访问令牌后,您可以使用JwtSecurityTokenHandler验证令牌,以下代码供您参考:
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());
您可以单击here获取代码示例,您可以修改代码以检查令牌是否来自存储在数据库中的tenant-id。