在运行时集成Windows Azure Active Directory Directory Bearer身份验证



当前,我使用以下代码将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。

相关内容

最新更新