生也有涯,知也无涯。这篇文章主要讲述如何获取Azure App Service的特定用户分配的托管服务标识的令牌?相关的知识,希望能为你提供帮助。
我正在尝试获取特定用户定义身份的msi令牌。我们的应用服务有2个用户定义的身份,我想要代表用户指定的身份之一的令牌。
这是代码:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(
"http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&
resource=https://management.azure.com/&
object_id=<
ObjectId>
&
client_id=<
clientId>
");
req.Headers["Metadata"] = "true";
req.Method = "GET";
try
{
// Call /token endpoint
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
// Pipe response Stream to a StreamReader, and extract access token
StreamReader streamResponse = new StreamReader(response.GetResponseStream());
string stringResponse = streamResponse.ReadToEnd();
Dictionary<
string, string>
list =
JsonConvert.DeserializeObject<
Dictionary<
string, string>
>
(stringResponse);
string accessToken = list["access_token"];
System.IO.File.WriteAllText(@".Log.txt", accessToken);
}
catch (Exception e)
{
string errorText = String.Format("{0} {1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
System.IO.File.WriteAllText(@".Log.txt", errorText);
throw;
}
它部署在azure app服务中。当我点击此部分时,我看到此错误:尝试以其访问权限禁止的方式访问套接字
我尝试连接到http://169.254.169.254以使用kudu控制台获取令牌。但是这个端点似乎无法访问。
文章图片
我确实尝试使用Microsoft.Azure.Services.AppAuthentication中的AzureServiceTokenProvider生成msi令牌,但找不到有关如何将其用于多个用户分配的身份的任何文档。
编辑:
更新1:
我尝试使用MSI_ENDPOINT环境变量中的端点而不是169.254.169.254。但是,当我运行应用服务时,看起来没有设置MSI_ENDPOINT值。这是我尝试过的代码:
var endpoint = Environment.GetEnvironmentVariable("MSI_ENDPOINT");
string apiVersion = "2018-02-01";
string resource = "https://management.azure.com/";
string objectId = "<
objectid>
";
string clientId = "<
clientId>
";
// Build request to acquire managed identities for Azure resources token
//HttpWebRequest req = (HttpWebRequest)WebRequest.Create(
//"http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&
resource=https://management.azure.com/&
object_id=4aef1720-b3b1-4935-8d68-e330508907fa&
client_id=558ecc75-8697-4419-bab9-aa2c87043cfd");
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(
String.Format(
"{0}?resource={1}&
api-version={2}&
object_id={3}&
client_id={4}",
endpoint,
resource,
apiVersion,
objectId,
clientId));
req.Headers["Metadata"] = "true";
req.Method = "GET";
try
{
// Call /token endpoint
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
// Pipe response Stream to a StreamReader, and extract access token
StreamReader streamResponse = new StreamReader(response.GetResponseStream());
string stringResponse = streamResponse.ReadToEnd();
Dictionary<
string, string>
list =
JsonConvert.DeserializeObject<
Dictionary<
string, string>
>
(stringResponse);
string accessToken = list["access_token"];
System.IO.File.WriteAllText(@".Log.txt", accessToken);
}
catch (Exception e)
{
string errorText = String.Format("{0} {1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
string log = "MSI_ENDPOINT : " + endpoint + "
";
log += ("ErrorText : " + errorText + "
");
System.IO.File.WriteAllText(@".Log.txt", errorText);
throw;
}
答案首先,这个链接How to use managed identities for App Service and Azure Functions提供了特定于MSI for App Services的良好文档。
【如何获取Azure App Service的特定用户分配的托管服务标识的令牌()】以下是快速示例代码..为您在问题中提出的特定用户分配的托管服务标识获取令牌。
- resource- 应为其获取令牌的资源的AAD资源URI。
- apiversion- 要使用的令牌API的版本。 “2017-09-01”是目前唯一支持的版本。
- clientId- 要使用的用户指定标识的ID。如果省略,则使用系统分配的标识。
public static async Task< HttpResponseMessage> GetToken(string resource, string apiversion, string clientId) { HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Add("Secret", Environment.GetEnvironmentVariable("MSI_SECRET")); return await client.GetAsync(String.Format("{0}/?resource={1}& api-version={2}& clientid={3}", Environment.GetEnvironmentVariable("MSI_ENDPOINT"), resource, apiversion,clientId)); }
总的来说,我在上面的示例代码中看到了一些您应该注意到的更改: 利用MSI_ENDPOINT在运行时构造URL 参数应该是clientid而不是client_id 不需要参数object_id api版本应该是“2017-09-01”,因为上面链接中的文档说这是唯一受支持的版本。 - 关于运行应用服务时未设置MSI_ENDPOINT值的问题,请查看Microsoft Docs中相同链接中的此注释
文章图片
- 与所有使用的参数相关的文档的屏幕截图
文章图片
推荐阅读
- 禁用Azure App Services上的某些W3C日志记录字段
- 具有真实电话号码的Firebase PhoneAuth不工作但白名单号正在运行 - Android
- Firebase的新Firestore DB对电子商务Android应用程序来说更贵吗()
- 通过bash脚本获取Android Studio项目的构建文件夹路径
- Django,Flask和Redis教程(Python框架之间的Web应用程序会话管理)
- 建立第一个Ember.js应用程序的指南
- AngularJS教程(自定义指令的神秘化)
- 建立WebRTC应用程序的一年(启动工程学)
- Ember Data(Ember数据库的综合教程)