使用证书的 Azure Active Directory 守护程序客户端
Azure Active Directory Daemon Client Using Certificates
我一直在 GitHub 上查看 Azure Active Directory 的官方 Authenticating to Azure AD in daemon apps with certificates 示例。 Web API 服务似乎对客户端一无所知。
- 您不会被告知登录 Azure 并使用 "Permissions to other applications" 部分为守护程序客户端添加访问 Web API 的权限。
- Web API 控制器操作不会检查调用者的声明以确保它是客户端应用程序。它确实有这段代码,但我并不完全理解:
public IEnumerable Get()
{
//
// The Scope claim tells you what permissions the client application has in the service.
// In this case we look for a scope value of user_impersonation, or full access to the service as the user.
//
Claim scopeClaim = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/scope");
if (scopeClaim != null)
{
if (scopeClaim.Value != "user_impersonation")
{
throw new HttpResponseException(new HttpResponseMessage { StatusCode = HttpStatusCode.Unauthorized, ReasonPhrase = "The Scope claim does not contain 'user_impersonation' or scope claim not found" });
}
}
// A user's To Do list is keyed off of the NameIdentifier claim, which contains an immutable, unique identifier for the user.
Claim subject = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier);
return from todo in todoBag
where todo.Owner == subject.Value
select todo;
}
我是否正确地认为使用我的 Azure AD 注册的任何客户端都可以访问 Web API,使用此示例的设置方式。
好问题,这无疑是误导。答案是肯定的 - 在您的 Azure AD 租户中注册的任何 Web 客户端都可以使用代码示例中描述的客户端凭据流程获得访问 Web 的令牌API。
如果您不希望出现这种情况,您有 2 个选择:
- 通过编辑应用程序清单 (see this sample) 为您的 Web API 定义至少一个 应用程序角色 。您可以定义一些有意义的东西,例如 "admin" 或更通用的东西,例如 "full_access"。在您的 Web API 代码中,您可以在授权请求之前检查相应的 角色声明 是否存在。如果您选择此策略,Azure AD 租户管理员将能够使用 对其他应用程序的权限 部分向各个客户端授予访问权限,如您所料。
- 另一种策略是根据某种 ACL 或白名单简单地检查传入令牌的声明。一种常见的做法是检查特定 well-known 客户端 ID 的 appid 声明。
示例代码使用 scope 声明确实具有误导性。 API 被编写为与代表用户(委托令牌)和使用应用程序的身份(客户端凭据)访问 API 的客户端一起工作。这就是为什么您会在其中看到范围声明。
在运行时,您引用的验证逻辑会发现 scopeClaim == null
。然后它将使用 ClaimTypes.NameIdentifier
声明(a.k.a。sub
声明)来识别客户端应用程序和 POST 或 GET 属于该特定应用程序的待办事项。
此示例不限制 Azure AD 租户中的哪些客户端可以访问 Web API。
希望这对您有所帮助。
我一直在 GitHub 上查看 Azure Active Directory 的官方 Authenticating to Azure AD in daemon apps with certificates 示例。 Web API 服务似乎对客户端一无所知。
- 您不会被告知登录 Azure 并使用 "Permissions to other applications" 部分为守护程序客户端添加访问 Web API 的权限。
- Web API 控制器操作不会检查调用者的声明以确保它是客户端应用程序。它确实有这段代码,但我并不完全理解:
public IEnumerable Get() { // // The Scope claim tells you what permissions the client application has in the service. // In this case we look for a scope value of user_impersonation, or full access to the service as the user. // Claim scopeClaim = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/scope"); if (scopeClaim != null) { if (scopeClaim.Value != "user_impersonation") { throw new HttpResponseException(new HttpResponseMessage { StatusCode = HttpStatusCode.Unauthorized, ReasonPhrase = "The Scope claim does not contain 'user_impersonation' or scope claim not found" }); } } // A user's To Do list is keyed off of the NameIdentifier claim, which contains an immutable, unique identifier for the user. Claim subject = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier); return from todo in todoBag where todo.Owner == subject.Value select todo; }
我是否正确地认为使用我的 Azure AD 注册的任何客户端都可以访问 Web API,使用此示例的设置方式。
好问题,这无疑是误导。答案是肯定的 - 在您的 Azure AD 租户中注册的任何 Web 客户端都可以使用代码示例中描述的客户端凭据流程获得访问 Web 的令牌API。
如果您不希望出现这种情况,您有 2 个选择:
- 通过编辑应用程序清单 (see this sample) 为您的 Web API 定义至少一个 应用程序角色 。您可以定义一些有意义的东西,例如 "admin" 或更通用的东西,例如 "full_access"。在您的 Web API 代码中,您可以在授权请求之前检查相应的 角色声明 是否存在。如果您选择此策略,Azure AD 租户管理员将能够使用 对其他应用程序的权限 部分向各个客户端授予访问权限,如您所料。
- 另一种策略是根据某种 ACL 或白名单简单地检查传入令牌的声明。一种常见的做法是检查特定 well-known 客户端 ID 的 appid 声明。
示例代码使用 scope 声明确实具有误导性。 API 被编写为与代表用户(委托令牌)和使用应用程序的身份(客户端凭据)访问 API 的客户端一起工作。这就是为什么您会在其中看到范围声明。
在运行时,您引用的验证逻辑会发现 scopeClaim == null
。然后它将使用 ClaimTypes.NameIdentifier
声明(a.k.a。sub
声明)来识别客户端应用程序和 POST 或 GET 属于该特定应用程序的待办事项。
此示例不限制 Azure AD 租户中的哪些客户端可以访问 Web API。
希望这对您有所帮助。