如何使用 Microsoft Graph 获取 AppKey API
How to get AppKey using Microsoft Graph API
我正在使用
创建新应用程序
POST https://graph.microsoft.com/beta/applications
我可以找回AppId,但是找不到获取AppKey的方法。我想稍后使用应用程序凭据访问该应用程序。
更新:
我在创建应用程序期间作为密码凭据发送的内容:
newAppObj.passwordCredentials = new List<AOBJ.AzurePasswordCredential>(){
new AOBJ.AzurePasswordCredential()
{
customKeyIdentifier = "T1rEXhNmUUmVqimnBPkirw==",
keyId = Guid.NewGuid().ToString(),
value = "WgjbF8vG3GM1XRGpc43fvtiO7ScpTGwh0jd6CjIRd40dCX3kP8LMlCdcrrEPBRidI4CXW1OCnSQJQxOzX+oIUw==",
startDate ="2016-06-01T13:59:30Z",// DateTimeOffset.UtcNow,
endDate = "2017-06-02T13:59:30Z"//DateTimeOffset.UtcNow.AddYears(2)
}
};
然后当我使用我之前设置的密钥生成授权令牌作为值时,我得到了这个响应,当我尝试使用是调用 MicrosoftGraph API:
{
"error": {
"code": "Authorization_IdentityNotFound",
"message": "The identity of the calling application could not be established.",
"innerError": {
"request-id": "42d3f97d-5ccb-4680-a6c2-dceb160d19c7",
"date": "2016-06-02T21:03:31"
}
}
}
当我通过 Azure 门户手动创建密钥时,api 调用工作正常。
更新 2:
因此,原来创建应用程序的 POST 并未创建基础 ServicePrincipal 对象。我必须在创建应用程序后创建它。
var servicePrincipal = O365OutlookClient.GetServicePrincipalForApp(InOnBoardingToken, createdAppObj.appId);
if (servicePrincipal== null || servicePrincipal.appId==null)
{
var servicePrincipalObj = new AOBJ.AzureServicePrincipal();
servicePrincipalObj.appId = createdAppObj.appId;
servicePrincipalObj.displayName = createdAppObj.displayName;
servicePrincipalObj.accountEnabled = true;
var servicePrincipalJson = O365OutlookClient.PostServicePrincipalSync(InOnBoardingToken, servicePrincipalObj);
}
应用程序密码凭据需要由您生成和设置(在您创建应用程序时,或稍后作为 PATCH
应用程序)。您可以通过生成强随机值、创建 passwordCredential 并将其添加到 passwordCredentials
集合来实现:
{
/* ... */
"passwordCredentials": [
{
"customKeyIdentifier": "T1rEXhNmUUmVqimnBPkirw==",
"endDate": "2016-06-02T13:59:30Z",
"keyId": "e4003ae7-15be-487a-92d7-5d75aafdb4dc",
"startDate": "2016-06-02T13:59:30Z",
"value": "WgjbF8vG3GM1XRGpc43fvtiO7ScpTGwh0jd6CjIRd40dCX3kP8LMlCdcrrEPBRidI4CXW1OCnSQJQxOzX+oIUw=="
}
]
/* ... */
}
customKeyIdentifier
是一个base64编码的字节数组(可以任意),keyId
是新生成的Guid,startDate
和endDate
是密码凭证的有效日期。实际密钥存储在 value
.
我正在使用
创建新应用程序POST https://graph.microsoft.com/beta/applications
我可以找回AppId,但是找不到获取AppKey的方法。我想稍后使用应用程序凭据访问该应用程序。
更新: 我在创建应用程序期间作为密码凭据发送的内容:
newAppObj.passwordCredentials = new List<AOBJ.AzurePasswordCredential>(){
new AOBJ.AzurePasswordCredential()
{
customKeyIdentifier = "T1rEXhNmUUmVqimnBPkirw==",
keyId = Guid.NewGuid().ToString(),
value = "WgjbF8vG3GM1XRGpc43fvtiO7ScpTGwh0jd6CjIRd40dCX3kP8LMlCdcrrEPBRidI4CXW1OCnSQJQxOzX+oIUw==",
startDate ="2016-06-01T13:59:30Z",// DateTimeOffset.UtcNow,
endDate = "2017-06-02T13:59:30Z"//DateTimeOffset.UtcNow.AddYears(2)
}
};
然后当我使用我之前设置的密钥生成授权令牌作为值时,我得到了这个响应,当我尝试使用是调用 MicrosoftGraph API:
{
"error": {
"code": "Authorization_IdentityNotFound",
"message": "The identity of the calling application could not be established.",
"innerError": {
"request-id": "42d3f97d-5ccb-4680-a6c2-dceb160d19c7",
"date": "2016-06-02T21:03:31"
}
}
}
当我通过 Azure 门户手动创建密钥时,api 调用工作正常。
更新 2:
因此,原来创建应用程序的 POST 并未创建基础 ServicePrincipal 对象。我必须在创建应用程序后创建它。
var servicePrincipal = O365OutlookClient.GetServicePrincipalForApp(InOnBoardingToken, createdAppObj.appId);
if (servicePrincipal== null || servicePrincipal.appId==null)
{
var servicePrincipalObj = new AOBJ.AzureServicePrincipal();
servicePrincipalObj.appId = createdAppObj.appId;
servicePrincipalObj.displayName = createdAppObj.displayName;
servicePrincipalObj.accountEnabled = true;
var servicePrincipalJson = O365OutlookClient.PostServicePrincipalSync(InOnBoardingToken, servicePrincipalObj);
}
应用程序密码凭据需要由您生成和设置(在您创建应用程序时,或稍后作为 PATCH
应用程序)。您可以通过生成强随机值、创建 passwordCredential 并将其添加到 passwordCredentials
集合来实现:
{
/* ... */
"passwordCredentials": [
{
"customKeyIdentifier": "T1rEXhNmUUmVqimnBPkirw==",
"endDate": "2016-06-02T13:59:30Z",
"keyId": "e4003ae7-15be-487a-92d7-5d75aafdb4dc",
"startDate": "2016-06-02T13:59:30Z",
"value": "WgjbF8vG3GM1XRGpc43fvtiO7ScpTGwh0jd6CjIRd40dCX3kP8LMlCdcrrEPBRidI4CXW1OCnSQJQxOzX+oIUw=="
}
]
/* ... */
}
customKeyIdentifier
是一个base64编码的字节数组(可以任意),keyId
是新生成的Guid,startDate
和endDate
是密码凭证的有效日期。实际密钥存储在 value
.