首页 > 其他分享 >【Azure Developer】Go语言调用Azure SDK如何登录到中国区Azure环境

【Azure Developer】Go语言调用Azure SDK如何登录到中国区Azure环境

时间:2023-01-12 15:58:13浏览次数:60  
标签:err confidential nil Go go Azure Developer sdk

问题描述

在 “使用 Azure SDK for Go 进行 Azure 身份验证” 文章中的 Go 示例代码进行登录Azure时,默认指向的是Globa Azure。当只修改AAD AZURE_CLIENT_ID , AZURE_TENANT_ID 和 AZURE_CLIENT_SECRET参数值,运行会抛出以下错误:

The resource principal named https://management.core.windows.net/ was not found in the tenant named XXXXXXXX有限公司. This cf the application has not been installed by the administrator of the tenant or consented to by any user in the tenant. You might have sent your authentication request to the wrong tenant.

 那么如何能够连接到China Azure呢?  

问题解答

Go代码中,使用 azidentity.NewDefaultAzureCredential(nil) 函数登录Azure AD,并且没有传入参数。所以默认就是登录到Global Azure中。

 

查看NewDefaultAzureCredential的构造函数,可以添加 ClientSecretCredentialOptions 参数,来设置登录的Azure 环境。

// NewClientSecretCredential constructs a ClientSecretCredential. Pass nil for options to accept defaults.
func NewClientSecretCredential(tenantID string, clientID string, clientSecret string, options *ClientSecretCredentialOptions) (*ClientSecretCredential, error) {
    if options == nil {
        options = &ClientSecretCredentialOptions{}
    }
    cred, err := confidential.NewCredFromSecret(clientSecret)
    if err != nil {
        return nil, err
    }
    c, err := getConfidentialClient(clientID, tenantID, cred, &options.ClientOptions)
    if err != nil {
        return nil, err
    }
    return &ClientSecretCredential{client: c}, nil
}



func getConfidentialClient(clientID, tenantID string, cred confidential.Credential, co *azcore.ClientOptions, additionalOpts ...confidential.Option) (confidential.Client, error) {
    if !validTenantID(tenantID) {
        return confidential.Client{}, errors.New(tenantIDValidationErr)
    }
    authorityHost, err := setAuthorityHost(co.Cloud)
    if err != nil {
        return confidential.Client{}, err
    }
    o := []confidential.Option{
        confidential.WithAuthority(runtime.JoinPaths(authorityHost, tenantID)),
        confidential.WithAzureRegion(os.Getenv(azureRegionalAuthorityName)),
        confidential.WithHTTPClient(newPipelineAdapter(co)),
    }
    o = append(o, additionalOpts...)
    return confidential.New(clientID, cred, o...)
}

所以修改代码就是添加环境参数!

    opts := azcore.ClientOptions{Cloud: cloud.AzureChina}
    cred, err := azidentity.NewDefaultAzureCredential(
        &azidentity.DefaultAzureCredentialOptions{ClientOptions: opts},
    )

修改前后的代码对比图:

 

附录:修改后的全部代码

package main

// Import key modules.
import (
    "log"

    "github.com/Azure/azure-sdk-for-go/sdk/azcore"
    "github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud"
    "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources"
)

// Define key global variables.
var (
    subscriptionId = "<subscription ID>"
)

// Define the function to create a resource group.

func main() {
    opts := azcore.ClientOptions{Cloud: cloud.AzureChina}
    cred, err := azidentity.NewDefaultAzureCredential(
        &azidentity.DefaultAzureCredentialOptions{ClientOptions: opts},
    )
    if err != nil {
        log.Fatalf("Authentication failure: %+v", err)
    }

    // Azure SDK Azure Resource Management clients accept the credential as a parameter
    client := armresources.NewClient(subscriptionId, cred, nil)

    log.Printf("Authenticated to subscription", client)
}

 

参考资料

Go SDK 设置Cloud : https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud#section-sourcefiles

使用 DefaultAzureCredential 对 ResourceClient 进行身份验证 : https://learn.microsoft.com/zh-cn/azure/developer/go/azure-sdk-authentication?tabs=bash

Successfully Authenticate AzureChina with an Azure Public Credential #18508 : https://github.com/Azure/azure-sdk-for-go/issues/18508

 

标签:err,confidential,nil,Go,go,Azure,Developer,sdk
From: https://www.cnblogs.com/lulight/p/17046895.html

相关文章

  • GoJS v1.8.27 去水印方法
    GoJSv1.8.27去水印方法 今天使用npm下载goJS之后,发现有水印。去除水印的方法是:在go.js文件中搜索关键字:("7eba17a4ca3b1a8346")][D.Wg("78a118b7"),会找到 把a......
  • 07-GoogLenet 图像分类
    Inception结构的主要思路是用密集成分来近似最优的局部稀疏结构。原始Inception结构如下图所示:  显然从上图中可以看出,原始Inception结构采用1×1、3×3......
  • HDU 5306 Gorgeous Sequence
    \(HDU\)\(5306\)\(Gorgeous\)\(Sequence\)标签:区间最值操作,吉司机线段树,简单模板题一、题目描述现在有这样的一个问题:你有一个长度为\(n\)(\(n≤1e6\))的序列,你......
  • mongodb 手动将字段更新成int32刷新表变double的情况
    问题想要直接在表中新建字段,将其设置为Int32刷新后解决使用语句添加新字段db.getCollection('Major').findAndModify({query:{'mid':{$in:["2621e213-2c37-47bb-93f9......
  • Go语言类型断言
    类型断言表达式value,ok:=interface{}(container).([]string)首先这个表达式叫做类型断言表达式,它的格式为:x.(T),其中x代表需要判断类型的值,而这个值当下的类型......
  • Python程序员需了解的:Django框架之环境安装
    虚拟环境安装:开发中问题:如何在同一台主机中,要开发多个不同的项目,而且需要用到同一个包的不同版本?尝试分析:在开发过程中,使用python的包时可以联网安装,使用sudopipinstall......
  • PLSQL Developer 12安装
    一、准备软件版本下载地址PLSQLDeveloper12.0.7https://www.allroundautomations.com/files/plsqldev1207x64.msiPLSQLDeveloper汉化包12.0https://www.......
  • 解决django-ckeditor本地可以显示,但上传至公网无法显示。
    背景&问题描述自己刚学习django搭建了一个自己的博客,导入ckeditor富文本编辑器,一开始是自己的127:0:0:1和公网都可以加载出来,之后又引入了一些模块改了一些bug...总之就......
  • 1012.Django中间件以及上下文处理器
    一、中间件中间件的引入:Django中间件(Middleware)是一个轻量级、底层的“插入”系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。  django中的中间......
  • ubuntu下配置django+apache+mysql+mod_python+Python
    网上有N种安装方法,我都试过,没有一个最后能成功,浪费了一下午的时间,终于搞定,1.installPython最新的Ubuntu操作系统是含有Python的,可以通过Python--version查看的:lab@lab:~......