当前位置: 首页 > 知识库问答 >
问题:

如何使用C#代码为aad令牌设置自定义声明

弘康安
2023-03-14

我有一个生成aad令牌的webapi,我已经在webapi的Get()方法中编写了令牌生成逻辑。

我能够从webapiget()方法生成aad jwt令牌,但现在我想在令牌中包含一些自定义声明。

如何使用c#将自定义声明设置为aad令牌。

我使用下面的代码来生成aad令牌。

var authenticationContext = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext("https://login.windows.net/" + ConfigurationManager.AppSettings["TenantID"].ToString());
            var credential = new ClientCredential(clientId: ConfigurationManager.AppSettings["ClientID"].ToString(), clientSecret: secret);
            var result = await authenticationContext.AcquireTokenAsync(
                ConfigurationManager.AppSettings["Resource"].ToString(),
                credential
                ).ConfigureAwait(false);

请共享任何示例c#代码,以将自定义声明设置为从上述代码生成的aad令牌。

注意:我想为aad令牌设置一个新的自定义声明,其中自定义声明值从外部逻辑获得。

更新1:

看起来下面的帖子可能有用。

https://www.rahulpnath.com/blog/azure-ad-custom-attributes-and-optional-claims-from-an-asp-dot-net-application/

我试着在下面跟着上面的帖子。

生成用于调用图形 API 的 jwt 令牌。但是我在下面的代码中被阻止了。

    var dictionary = new Dictionary<string, object>();
        dictionary.Add(employeeCodePropertyName, employee.Code);

//Here I can't use graphApiClient.Users because, I don't have any user info on my jwt token. It will be just Access token which as details related to aad application.I want to update extension attribute which is present in OptionalClaims -> Access Token of AAD Application Manifest.
        await graphApiClient.Users[employee.EmailAddress]  
            .Request()
            .UpdateAsync(new User()
            {
                AdditionalData = dictionary
            });

如何更新可选声明的访问令牌中存在的扩展声明属性。我想通过c#代码进行更新。如何做到这一点。请提出建议。

更新2:

我想使用类似于下面的代码来更新Azure广告应用程序的可选声明中存在的自定义扩展声明属性,但UpdateAsync不起作用。

await graphApiClient.Application[clientid]  
            .Request()
            .UpdateAsync(new Application()
            {
                AdditionalData = dictionary
            });

UpdateAsync(),我遇到的问题如下

Specified HTTP method is not allowed for the request

请让我知道添加自定义用户定义的声明azure广告访问令牌的解决方案。

注意:因为我想更新访问令牌,所以访问令牌上不会有任何用户信息。因此,GraphAppClient.Users[employee.EmailAddress]将不起作用,因为访问令牌将没有任何用户信息,如EmailAddress

我在azure ad ap清单中创建了扩展声明属性,如下所示

我想使用通过代码从外部源代码获取的值动态更新扩展声明属性extension_clientid_moviename值。如何做到这一点。请建议。

更新3:

我尝试了下面的代码来更新可选声明ID标记中的扩展声明属性。

   await graphApiServiceClient.Users["abcd@hotmail.com"]
                .Request()
                .UpdateAsync(new User()
                {
                    AdditionalData = dictionary
                });

我得到的错误如下

Code: Request_ResourceNotFound\r\nMessage: Resource '' does not exist or one of its queried reference-property objects are not present.

共有2个答案

凌钊
2023-03-14

关于更新3中的问题,我们不能在这里使用来宾用户的电子邮件。我们应该改用ObjectId。这就是为什么会出现< code > Request _ ResourceNotFound 错误。

await graphApiServiceClient.Users["ObjectId"]
                .Request()
                .UpdateAsync(new User()
                {
                    AdditionalData = dictionary
                });
公孙霖
2023-03-14

这是因为您正在使用OAuth 2.0客户端凭据流获取访问令牌:

https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow

该流通常用于服务器到服务器的交互,无需与用户立即交互。因此,您无法在访问令牌中找到用户信息。

您提供的文档正在添加User的扩展属性,请通过Microsoft Graph更新该值:

await graphApiClient.Users[employee.EmailAddress]
    .Request()
    .UpdateAsync(new User()
    {
        AdditionalData = dictionary
    });

该电子邮件不是来自访问令牌,您应该手动提供 api 要更新属性值的用户的电子邮件。

但是,由于该属性是用户的扩展属性,当用户在客户端应用程序中使用Azure AD登录时,您可以从ID令牌中的声明中获取值。该声明将不包括在使用客户端凭据流发布的访问令牌中。

 类似资料:
  • 我有一个Web应用程序(Angular 7),它使用MSAL Angular对Azure AD用户进行身份验证,并获取访问我的Web API(.NET 4.6)的访问令牌。这两个应用都已在Azure门户中注册,并具有以下权限,如下所述: Web应用程序:for Web API(委派) Web API:<代码>用户。阅读邮政发送MS图表(委派) 现在,我想使用ADAL for从Web API调用Mi

  • 我正在使用selenium+webdriver并尝试测试不同的用户代理。我正在为Windows上的Chrome添加用户代理,例如: 现在,当我登录查看登录详细信息时,它说的是Windows Chrome,但当我想把它重命名为其他东西时,就像这样:

  • 我正在尝试创建一个自定义令牌,以使用用户的用户名登录。我看过一些文件https://firebase.google.com/docs/auth/admin/create-custom-tokens#web,通过如何为用户提供用户名而不是电子邮件登录链接到我?,我发现我需要补充 使用Firebase Admin SDK创建自定义令牌 和 在客户端上使用自定义令牌登录 目前我可以看到基于留档需要包含什

  • 我正在使用MPAndroidChart显示一个相对简单的条形图。 有2件事我需要设置,我不知道如何自定义: > 我需要为每个条添加文本,而不是简单的值,每个条本身也有样式。 在每个条的顶部,我需要放置各种类型的可绘制材料来覆盖它的宽度(例如一个条中高度为2dp的蓝色,或另一个条上高度相同的黄色渐变)。 下面是我需要做的一个演示: > 我知道我也可以通过使用添加图标,但这似乎不适用于应该使用整个条形

  • 问题内容: 我正在使用Spring 3.1,并且想使用新的缓存功能。然后,我尝试: 但是我没有找到配置自定义KeyGenerator的方法。任何想法? 问题答案: 好的,我只是找到一种方法来做… 如您所见,我使用AnnotationDrivenCacheBeanDefinitionParser,将配置放入xml中,并且可以::完成! 编辑: 对于Spring> 3.2,可以使用实现CachingC