【问题标题】:Integrate Windows Azure Active Directory Bearer Authentication at run time在运行时集成 Windows Azure Active Directory 承载身份验证
【发布时间】:2017-07-22 00:57:04
【问题描述】:

目前,我正在使用以下代码将 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 config 屏幕,输入正确的 Client Id、Tenant、Client Secret。但用户无法使用 azure AD 用户登录。
谁能帮我解释一下这个案例?
有没有办法将 azure config 保存在 db 而不是 web.config 中?

【问题讨论】:

  • 将您的 Azure AD 转为多租户并添加自定义逻辑以检查令牌是否来自存储在数据库中的租户 ID
  • 我的问题是用户可以在应用程序启动后在运行时更改 Azure 配置,但是 UseWindowsAzureActiveDirectoryBearerAuthentication 不会读取用户的更改。它仍然使用 StartUp.Auth.cs 中的第一个配置
  • 能否提供样品供您参考?

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


【解决方案1】:

您在帖子中的代码在 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获取代码示例,您可以修改您的代码以检查令牌是否来自存储在数据库中的租户ID。

【讨论】:

  • 您好,您的解决方案适用于使用 Azure 云验证登录。但是,我的应用同时支持 Azure 云和本地帐户登录,当添加验证码时,它将验证来自 Azure 云和本地登录的所有令牌。有什么方法可以仅对 Azure Cloud 中的令牌应用令牌验证?
  • 您可以检查访问令牌的颁发者,形成 azure ad 1.0,颁发者类似于:https://sts.windows.net/{tenant}/。您可以使用以下代码获取来自访问令牌的颁发者:var jwtTokenClaims = new JwtSecurityToken(jwtToken); var issuer = jwtTokenClaims.Issuer;
猜你喜欢
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
相关资源
最近更新 更多