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

时间:2015-12-22 11:53:27

标签: azure azure-active-directory

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

  1. 您不会被告知登录Azure并使用“对其他应用程序的权限”部分为守护程序客户端添加访问Web API的权限。
  2. Web API控制器操作不会检查调用方的声明,以确保它是客户端应用程序。它确实有这个代码,但我并不完全理解:
  3. 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,并且设置此示例的方式,我是否正确。

1 个答案:

答案 0 :(得分:3)

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

如果您不想要此行为,则有2个选项:

  1. 通过编辑应用程序清单(see this sample)为您的Web API定义至少一个应用程序角色。您可以定义一些有意义的内容,如“admin”或更通用的内容,如“full_access”。在Web API代码中,您可以在授权请求之前检查是否存在相应的角色声明。如果您选择此策略,Azure AD租户管理员将能够按照您的预期使用对其他应用程序的权限部分授予对各个客户的访问权限。
  2. 另一种策略是简单地检查传入令牌对某种ACL或白名单的声明。通常的做法是检查特定知名客户ID的 appid 声明。
  3. 示例代码确实会误导其使用范围声明。编写API是为了代表用户(委托的令牌)和使用应用程序的身份(客户端凭证)访问API的客户端。这就是你在那里看到范围声明的原因。

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

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

    希望这有帮助。