我一直在GitHub上查看Azure Active Directory的官方Authenticating to Azure AD in daemon apps with certificates示例。 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,并且设置此示例的方式,我是否正确。
答案 0 :(得分:3)
好问题,这无疑是误导性的。答案是肯定的 - 在Azure AD租户中注册的任何Web客户端都可以使用代码示例中描述的客户端凭据流获取访问Web API的令牌。
如果您不想要此行为,则有2个选项:
示例代码确实会误导其使用范围声明。编写API是为了代表用户(委托的令牌)和使用应用程序的身份(客户端凭证)访问API的客户端。这就是你在那里看到范围声明的原因。
在运行时,您引用的验证逻辑将找到scopeClaim == null
。然后,它将使用ClaimTypes.NameIdentifier
声明(a.k.a。sub
声明)来标识客户端应用程序以及属于该特定应用程序的POST或GET待办事项。
此示例不限制Azure AD租户中的哪些客户端可以访问Web API。
希望这有帮助。