You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MSAL中机密客户端能否使用委托访问?客户端密钥流用户认证方案

机密客户端使用委托访问的说明

核心结论

机密客户端可以使用委托访问,但不能通过客户端凭证流(Client Credential Flow)实现——这个流本身是用于获取应用权限(代表应用自身,而非具体用户)的,而委托权限必须绑定到具体用户身份,需要用户参与授权流程。

你的代码报错原因

你用AcquireTokenByCredential(客户端凭证流)请求User.Read这个委托权限,AAD会直接拒绝,因为客户端凭证流要求作用域必须是{资源ID}/.default格式,对应应用权限。你收到的AADSTS1002012错误就是这个原因。

正确实现委托访问的方式

如果你的服务器是机密客户端,要代表用户访问资源,应该用授权码流(Authorization Code Flow),流程如下:

  1. 前端引导用户到AAD授权页面,获取授权码
  2. 后端(机密客户端)用这个授权码,加上自己的客户端密钥/证书,向AAD请求访问令牌(此时令牌是代表该用户的委托权限)

修正后的代码示例(授权码流)

package main

import (
    "context"
    "fmt"

    "github.com/AzureAD/microsoft-authentication-library-for-go/apps/confidential"
)

func main() {
    cred, err := confidential.NewCredFromSecret("MY_CLIENT_SECRET")
    if err != nil {
        panic(err)
    }

    confidentialClient, err := confidential.New(
        "https://login.microsoftonline.com/"+"MY_TENANT_ID",
        "MY_CLIENT_ID",
        cred,
    )
    if err != nil {
        panic(err)
    }

    // 注意:这里的授权码需要从前端获取,用户完成授权后AAD会返回
    authCode := "USER_AUTHORIZATION_CODE"
    redirectURI := "YOUR_REDIRECT_URI" // 要和应用注册里配置的一致

    result, err := confidentialClient.AcquireTokenByAuthCode(
        context.Background(),
        []string{"User.Read"},
        authCode,
        confidential.WithRedirectURI(redirectURI),
    )
    if err != nil {
        panic(err)
    }

    fmt.Println("获取到代表用户的委托权限令牌:", result.AccessToken)
}

补充说明

  • 应用注册时,要确保已添加User.Read等所需的委托权限,并完成管理员同意(如果需要)
  • 授权码流中,机密客户端的身份通过客户端密钥/证书验证,同时令牌绑定到具体用户,满足你“服务器作为机密客户端,代表用户认证”的需求

内容的提问来源于stack exchange,提问作者Runxi Yu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:04:56