使用证书的 Azure Active Directory 守护程序客户端

Posted

技术标签:

【中文标题】使用证书的 Azure Active Directory 守护程序客户端【英文标题】:Azure Active Directory Daemon Client Using Certificates 【发布时间】:2016-03-28 16:31:23 【问题描述】:

我一直在 GitHub 上查看 Azure Active Directory 的官方 Authenticating to Azure AD in daemon apps with certificates 示例。 Web API 服务似乎对客户端一无所知。

    您不会被告知登录 Azure 并使用“对其他应用程序的权限”部分为守护程序客户端添加访问 Web API 的权限。 Web API 控制器操作不检查调用者的声明以确保它是客户端应用程序。它确实有这段代码,但我并不完全理解:
公共 IEnumerable Get() // // Scope 声明告诉您客户端应用程序在服务中拥有哪些权限。 // 在这种情况下,我们寻找 user_impersonation 的范围值,或作为用户对服务的完全访问权限。 // Claim scopeClaim = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/scope"); 如果(范围声明!= null) if (scopeClaim.Value != "user_impersonation") throw new HttpResponseException(new HttpResponseMessage StatusCode = HttpStatusCode.Unauthorized, ReasonPhrase = "范围声明不包含 'user_impersonation' 或未找到范围声明" ); // 用户的待办事项列表与 NameIdentifier 声明无关,其中包含用户的不可变的唯一标识符。 索赔主题 = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier); 从 todoBag 中的 todo 返回 其中 todo.Owner == subject.Value 选择待办事项;

我认为在我的 Azure AD 中注册的任何客户端都可以通过此示例的设置方式访问 Web API 是否正确。

【问题讨论】:

【参考方案1】:

好问题,这无疑是一种误导。答案是肯定的 - 在 Azure AD 租户中注册的任何 Web 客户端都可以使用代码示例中描述的客户端凭据流获取访问 Web API 的令牌。

如果您不希望这种行为,您有 2 个选择:

    通过编辑应用程序清单 (see this sample) 为您的 Web API 定义至少一个应用程序角色。你可以定义一些有意义的东西,比如“admin”或者更通用的东西,比如“full_access”。在您的 Web API 代码中,您可以在授权请求之前检查是否存在相应的角色声明。如果您选择此策略,Azure AD 租户管理员将能够使用 Permissions to Other Applications 部分向各个客户端授予访问权限,如您所料。 另一种策略是简单地根据某种 ACL 或白名单检查传入令牌的声明。一种常见的做法是检查特定知名客户端 ID 的 appid 声明。

示例代码确实具有误导性,因为它使用了 scope 声明。 API 被编写为与代表用户(委托令牌)和使用应用程序的身份(客户端凭据)访问 API 的客户端一起使用。这就是您在其中看到范围声明的原因。

在运行时,您引用的验证逻辑会发现 scopeClaim == null。然后,它将使用 ClaimTypes.NameIdentifier 声明(也称为 sub 声明)来识别客户端应用程序以及属于该特定应用程序的 POST 或 GET 待办事项。

此示例不限制 Azure AD 租户中的哪些客户端可以访问 Web API。

希望这会有所帮助。

【讨论】:

以上是关于使用证书的 Azure Active Directory 守护程序客户端的主要内容,如果未能解决你的问题,请参考以下文章

使用 Azure Active Directory 或 ADFS 或 AD 的 SSO

使用 Azure Active Directory 时 SonarLint 身份验证不起作用

使用 azure-cli 访问 Azure Active Directory 的令牌

用于查询Azure Active Directory的Azure服务

使用Laravel的Azure Active Directory SSO

[Azure - Security] Azure的多重身份验证:使用AD(Azure Active Directory)开启用户MFA