你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

身份验证

进行 REST 调用时,需要执行几个步骤才能正确进行身份验证。 Azure 通信服务 SDK 会为你处理此过程,但手动发出请求意味着需要自行处理。

身份验证类型

Azure 通信服务有三种类型的身份验证,它们用于不同的目的:

  • 短信、网络遍历、呼叫自动化、标识和访问令牌操作的访问密钥身份验证。 访问密钥身份验证适用于在受信任的服务环境中运行的应用程序。
  • Azure AD 身份验证 与访问密钥身份验证类似。 访问控制更精细,并利用 Azure RBAC。
  • 聊天和通话的用户访问令牌身份验证。 用户访问令牌允许客户端应用程序直接针对Azure 通信服务进行身份验证。 这些令牌是在创建的服务器端令牌预配服务上生成的。 然后,将它们提供给使用令牌初始化聊天和呼叫客户端库的客户端设备。

访问密钥身份验证

当最终用户应用程序未发出请求时,将使用访问密钥身份验证。 在受信任的服务环境中运行这些请求。

在此身份验证方法中,使用客户端生成的 基于哈希的消息身份验证代码 (HMAC) 对请求进行签名。

在开始之前,请确保:

  • Azure 通信服务访问密钥
  • Azure 通信服务终结点
  • 要调用的 URL 路径和 HTTP 谓词
  • 开发环境,可以生成 HMAC、SHA256 哈希和执行 Base64 操作。

获得这些项后,可以继续对请求进行签名。

对 HTTP 请求进行签名

  1. 请确保具有以下可用值:

    • 例如,HTTP 请求方法 (或 GETPUT)
    • 根据 RFC1123 标准,请求的协调世界时 (UTC) 时间戳
    • HTTP 请求主机 (<authority> RFC2396) 中指定的 URI 组件
    • 使用 SHA256 算法哈希处理 HTTP 请求正文
    • HTTP 请求路径 (<path> ,并由 <query>? RFC2396) 中指定的组件连接
    Verb=<http_method>
    Timestamp=<current_datetime>
    Host=<uri_authority>
    ContentHash=SHA256(<request_body>)
    URIPathAndQuery=<uri_path>?<uri_query>
    
  2. 通过以下方式串联值来构造要签名的字符串:

    StringToSign=Verb + "\n"
    URIPathAndQuery + "\n"
    Timestamp + ";" + Host + ";" + ContentHash
    
  3. 生成在上一步中创建的 UTF-8 编码字符串的 HMAC-256 签名。 接下来,将结果编码为 Base64。 还需要对访问密钥进行 Base64 解码。 使用以下格式 (显示为伪代码) :

    Signature=Base64(HMAC-SHA256(UTF8(StringToSign), Base64.decode(<your_access_key>)))
    
  4. 将以下标头添加到请求:

    x-ms-date: <Timestamp>
    x-ms-content-sha256: <ContentHash>
    host: <URIPathAndQuery>   
    Authorization: "HMAC-SHA256 SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature=<Signature>"
    

收到请求后,服务会验证签名和时间戳,以防止某些安全攻击,包括重播攻击。 若要了解如何使用各种编程语言对 HTTP 请求进行签名,请访问 HMAC 标头签名教程

Azure AD 身份验证

当请求者是 Azure RBAC 安全主体时,可以使用 Azure AD 身份验证。 安全主体可以是用户、组、服务主体或托管标识。

在开始之前,请确保:

  • Azure 服务主体
  • 要调用的 URL 路径和 HTTP 谓词

有关如何获取服务主体,请参阅 - 从 Azure CLI 创建 Azure Active Directory 服务主体应用程序

创建服务主体后,可以使用其中一个机密进行身份验证,以访问通信服务以创建用户、颁发用户访问令牌或发送短信。

在请求中使用安全主体凭据

获得安全主体的 ID 和机密后,可以通过在“授权”标头中提供它们,在请求Azure 通信服务 REST API 中使用它们。

authorizationHeaderValue = convertToBase64String(<security principal ID> + ":" + <secret of the security principal>)
Authorization="BASIC <authorizationHeaderValue>"

用户访问令牌身份验证

用户访问令牌允许客户端应用程序直接针对作为特定用户或标识Azure 通信服务进行身份验证。

生成/获取用户访问令牌

用户访问令牌由你在受信任的环境中生成。 使用 Azure 通信服务 Identity SDK 生成它们是最简单的方法。 有关详细信息,请参阅 创建和管理用户访问令牌

在请求中使用用户访问令牌

获得合适的用户访问令牌后,可以将其包含在对Azure 通信服务 REST API 的请求中。 为此,需要使用持有者 HTTP 身份验证方案 Authorization: Bearer <token>Authorization 标头中提供它。

另请参阅

有关Azure 通信服务身份验证的其他信息,还可以查看: