Azure服务主体RemoveKey c#

bq9c1y66  于 2023-06-24  发布在  C#
关注(0)|答案(2)|浏览(100)

我正在尝试删除服务帐户的证书。我正在使用服务主体帐户Microsoft.Graph*(5.14.0)* 执行此操作,该帐户是全局管理员,对Graph具有必要的权限。此主帐户通过证书进行身份验证。
我在这里遵循了像MicrosoftIdentityPlatformProofTokenGenerator这样的C#示例:

我系统地得到一个Access Token missing or malformed错误...表明问题肯定来自证明域

var requestBody = new Microsoft.Graph.ServicePrincipals.Item.RemoveKey.RemoveKeyPostRequestBody
{
    KeyId = key.KeyId,
    Proof = proof
};

try
{
    await graphClient.ServicePrincipals[sp.Id].RemoveKey.PostAsync(requestBody);
}
catch (ODataError err)
{
    var message = err.Error?.Message;
}

据我所知:

  • 我们使用与发出调用的principalservice相关联的应用程序的对象ID创建证明(我也尝试使用sp的ID)。
  • 我们使用principalservice的证书来生成一个证明令牌(我使用的证书与我用来标识自己的证书相同)。而且我也试过用我想删除的那个和sp的身份,但什么都没有)
  • 或者使用Microsoft Graph ID作为受众(这不是很清楚,但我也尝试了AAD Graph API)
  • 00000002-0000-0000-c000-000000000000 AAD图形API
  • 00000003-0000-0000-c000-000000000000 Microsoft Graph API
  • 我发送pfxFile(私钥和公钥)来生成证明

我做错了什么?
先谢谢你了

ctehm74n

ctehm74n1#

我生成了访问令牌,当我尝试**removeKey时,我得到了错误**,如下所示:

如果传递无效的访问令牌来执行操作,或者aud与访问资源不匹配,通常会出现错误“Access Token missing or malformed”。

要解决错误,请检查以下内容:

  • 检查**' = '**填充字符是否存在于JWT头或有效载荷中,如果是,则删除它以避免Authentication_MissingOrMalformed错误。

确保授予管理员同意**Application.ReadWrite.OwnedBy**,如下所示:

解码令牌,并确保aud00000003-0000-0000-c000-000000000000https://graph.microsoft.com,并且存在所需的角色:

var graphClient = new GraphServiceClient(requestAdapter);

var requestBody = new Microsoft.Graph.ServicePrincipals.Item.RemoveKey.RemoveKeyPostRequestBody
{
    KeyId = Guid.Parse("f0b0b335-1d71-4883-8f98-567911bfdca6"),
    Proof = "eyJ0eXAiOiJ...",
};
await graphClient.ServicePrincipals["{servicePrincipal-id}"].RemoveKey.PostAsync(requestBody);

在上面的代码中,将servicePrincipal-id替换为以下值:

请确保访问令牌未过期或使用相同的令牌在Postman中进行测试。
以上更改后,我可以通过Postman成功removeKey,如下所示:

POST https://graph.microsoft.com/v1.0/servicePrincipals/{id}/removeKey
Content-Type: application/json

{
    "keyId": "KeyID",
    "proof":"Token."
}

cl25kdpy

cl25kdpy2#

非常感谢您的回答!
在你的例子中,在我看来,我的令牌没有正确创建。
我使用文档[https://learn.microsoft.com/en-us/graph/application-rollkey-prooftoken?tabs=csharp][1]

1.应用/服务主体

当我读到你的例子时,你在/applications/{id}/removeKey上用postman发帖,但是c# graph API...

await graphClient.ServicePrincipals[sp.Id].RemoveKey.PostAsync(requestBody);

在此处删除servicePrincipal的KeyCredentials /servicePrincipals/{id}/removeKey

2. JWT内容
**M$**示例没有讨论要在令牌中指定的角色,也没有讨论将https://graph.microsoft.com放入aud的可能性

当尝试时,我仍然得到相同的错误。我的有效载荷:

{
  "aud": "https://graph.microsoft.com",
  "iss": "f8d5d85a-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "roles": [
    "Application.ReadWrite.OwnedBy"
  ],
  "exp": 1687525224,
  "nbf": 1687524624,
  "iat": 1687524626
}

我说明更多的上下文:
SP_1(objectID f8d5d85a-...)* 是ServicePrincipal (属于APP_1 在我的Azure AD中是Global administrator,并且在同意的情况下具有所有GraphApi访问权限
*SP_1使用链接的spSP_2创建应用程序APP_2
工作流程

  • 使用此SP_1登录,带图表 (确定)
    *SP_1加载SP_2信息
    *SP_1removeKey在SP_2的KeyCredentials中

测试POST中发送的证明jwt是用以下命令生成的:

  • 登录令牌 SP_1 -->KO
  • aud=https:graph.microsoft.com
  • iss={idSP_1} -->KO
  • aud=https:graph.microsoft.com
  • {idSP_1}
  • 证书= pfxSP_1-->KO
  • aud=https:graph.microsoft.com
  • {idSP_1}
  • 证书= pfx to delete -->KO
  • aud=https:graph.microsoft.com
  • {idSP_2}
  • 证书= pfx to delete -->KO

-> I测试,aud=00000003-0000-0000-c 000 - 00000000000和00000002-0000-0000-c 000 - 0000000000
->我测试有和没有角色
->所有图API授权在APP_1APP_2中创建
:'(

相关问题