Windows Azure Active Directory 承载身份验证

Posted

技术标签:

【中文标题】Windows Azure Active Directory 承载身份验证【英文标题】:Windows Azure Active Directory Bearer Authentication 【发布时间】:2016-12-15 19:44:08 【问题描述】:

我正在努力思考如何使用 Azure Active Directory 保护 Web API 资源。目前,我有一个 Angular 2 应用程序,它将用户重定向到 Azure AD 登录页面,并收到一个 id_token 作为回报。此 id 令牌在后续调用中用作不记名令牌,它似乎正在工作。我的问题就在这里。

    public void ConfigureAuth(IAppBuilder app)
    
        app.UseWindowsAzureActiveDirectoryBearerAuthentication(
            new WindowsAzureActiveDirectoryBearerAuthenticationOptions
            
                TokenValidationParameters = new TokenValidationParameters
                
                    ValidAudience = ConfigurationManager.AppSettings["ida:ClientId"],
                    ValidateIssuer = true
                ,
                Tenant = ConfigurationManager.AppSettings["ida:TenantId"]
            );
    

似乎这里是我们验证不记名令牌的地方。我真的不明白它是如何工作的。它是否在每次 API 调用时都与 Azure AD 通信?如果是这样,这是理想的方法(就性能而言)?如果没有,这如何阻止某人创建自己的令牌并侵入 API?

我确信我缺少一些重要的知识来理解这一点,所以如果你有任何我应该阅读的资源来更好地理解这一点,请提出建议。

谢谢!

【问题讨论】:

【参考方案1】:

您可以通过TokenValidationParameters 定义要验证的属性和/或您可以创建通知来实现您自己的验证器。

在上面的代码中,您定义了 ValidateIssuer = true - 这意味着 Issuer 将被验证 - 否则,中间件将检查 Issuer (令牌中的iss 声明)与注册应用程序的租户 ID 匹配(例如,如果应用程序在租户 contoso.com 上注册,则该参数验证令牌是否实际由租户 contoso.com 颁发) -阻止另一个租户生成的令牌。

ValidAudience = true 告诉中间件验证生成的令牌是否实际生成到您的应用程序。因此无需每次都与 Azure AD 进行通信。

有关令牌验证的更多选项,请参阅此MSDN article。

另请参阅下面有关令牌验证的精彩帖子:

http://www.cloudidentity.com/blog/2014/03/03/principles-of-token-validation/

【讨论】:

以上是关于Windows Azure Active Directory 承载身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Windows Azure Active Directory 承载身份验证

使用 Azure Active Directory 连接到 MSSQL 服务器的 JDBC

如何使用 Azure AD 为应用服务上的 Spring Boot 应用设置重定向 URI

在本地和 Azure 上使用 Active Directory 进行身份验证

Azure SQL Active Directory集成身份验证,联合域

Azure Active Directory:web api调用另一个web api