在 Windows 时间集成 Windows Azure Active Directory 承载身份验证

Integrate Windows Azure Active Directory Bearer Authentication at run time

目前,我正在使用以下代码将 Azure Active Directory 集成到我的 .NET Web API:

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
    new WindowsAzureActiveDirectoryBearerAuthenticationOptions
    {
        Audience = WebConfigurationManager.AppSettings["AzureClientId"],
        Tenant = WebConfigurationManager.AppSettings["AzureTenant"]
    }
});

观众和租户在web.config文件中设置。
我可以正确获取令牌,用户可以使用他们的 Azure AD 帐户登录。
但是,我将观众和租户移至数据库,以允许用户通过 UI 更改设置和 disable/enable azure 登录,而不是更改 web.config 中的设置。
上面的代码改为:

var azureSetting = db.GetAzureSetting();
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
    new WindowsAzureActiveDirectoryBearerAuthenticationOptions
    {
        Audience = azureSetting.AzureClientId,
        Tenant = azureSetting.AzureTenant
    }
});

应用程序第一次启动时,数据库中没有配置,因为用户还没有输入配置。然后用户转到 azure 配置屏幕,输入正确的 Client Id、Tenant、Client Secret。但用户无法使用 azure AD 用户登录。
谁能帮我解释一下这个案例?
有什么办法可以在数据库中保存 azure 配置而不是 web.config?

您在 post 中的代码在 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 颁发的,并根据业务逻辑验证令牌中的声明,在您的场景中,您需要确认受众和房客。

在您的网络 api 应用程序中,您可以在 Global.asax 中注册自定义 TokenValidationHandler :

 GlobalConfiguration.Configuration.MessageHandlers.Add(new TokenValidationHandler());

您可以单击 here 获取代码示例,您可以修改代码以检查令牌是否来自存储在数据库中的租户 ID。