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

时间:2017-03-02 10:38:36

标签: azure asp.net-web-api active-directory bearer-token

目前,我正在使用以下代码将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配置?

1 个答案:

答案 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。