Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C#代码将自定义声明设置为aad令牌_C#_Asp.net Core_Active Directory_Azure Active Directory_Azure Ad Graph Api - Fatal编程技术网

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

如何使用C#代码将自定义声明设置为aad令牌,c#,asp.net-core,active-directory,azure-active-directory,azure-ad-graph-api,C#,Asp.net Core,Active Directory,Azure Active Directory,Azure Ad Graph Api,我有一个生成aad令牌的webapi,我在webapi的Get()方法中编写了令牌生成逻辑 我能够从webapiget()方法生成aad jwt令牌,但现在我想在令牌中包含一些自定义声明 如何使用c#将自定义声明设置为aad令牌 我使用了下面的代码来生成aad令牌 var authenticationContext = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext("https://login.

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

我能够从webapi
get()
方法生成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:

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

我试过下面的帖子

生成用于调用图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
            });
UpdateAsync()
,我得到的问题如下

Specified HTTP method is not allowed for the request
请让我知道向azure ad访问令牌添加自定义用户定义声明的解决方案

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

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

我想用通过代码从外部源获得的值动态更新扩展声明属性
extension\u clientid\u 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.

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

该流通常用于服务器到服务器的交互,而无需立即与用户交互。所以在访问令牌中找不到用户信息

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

await graphApiClient.Users[employee.EmailAddress]
    .Request()
    .UpdateAsync(new User()
    {
        AdditionalData = dictionary
    });
该电子邮件不是来自访问令牌,您应该手动提供api希望更新属性值的用户的电子邮件


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

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

该流通常用于服务器到服务器的交互,而无需立即与用户交互。所以在访问令牌中找不到用户信息

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

await graphApiClient.Users[employee.EmailAddress]
    .Request()
    .UpdateAsync(new User()
    {
        AdditionalData = dictionary
    });
该电子邮件不是来自访问令牌,您应该手动提供api希望更新属性值的用户的电子邮件


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

关于更新3中的问题,我们不能在此处使用来宾用户电子邮件。我们应该改用ObjectId。这就是为什么会出现
请求\u ResourceNotFound
错误

await graphApiServiceClient.Users["ObjectId"]
                .Request()
                .UpdateAsync(new User()
                {
                    AdditionalData = dictionary
                });

关于更新3中的问题,我们不能在此处使用来宾用户的电子邮件。我们应该改用ObjectId。这就是为什么会出现
请求\u ResourceNotFound
错误

await graphApiServiceClient.Users["ObjectId"]
                .Request()
                .UpdateAsync(new User()
                {
                    AdditionalData = dictionary
                });

“salt加密”可以作为您的解决方案。请提供任何示例代码或有用的链接。您可以根据需要更改SHA1中的算法。希望这会有所帮助。抱歉,实际上我对使用盐散列方法的密码加密有点困惑。我没有在数据库中存储任何密码。请您解释一下,它如何符合我的要求。我想在生成azure aad jwt令牌之前添加新的自定义声明。“salt加密”可以是您的解决方案。请提供任何示例代码或有用的链接。您可以根据需要更改SHA1中的算法。希望这会有所帮助。抱歉,实际上我对使用盐散列方法的密码加密有点困惑。我没有在数据库中存储任何密码。请您解释一下,它如何符合我的要求。我想在生成azure aad jwt令牌之前添加新的自定义声明。我想更新访问令牌而不是ID令牌中的自定义用户定义声明。请参阅我问题中的更新2以了解详细信息和解决建议。该声明不在access token中。我想将自定义用户定义的声明添加到access token中。如何做到这一点。我尝试在azure ad应用程序中的可选声明下创建扩展属性,如屏幕截图所示。但是如何通过代码动态更新该属性值。1。该扩展声明将包含在ID令牌而不是访问令牌中。2.您可以使用microsoft graph来管理特定用户的属性,但您需要授予正确的权限:简而言之,您可以使用microsoft graph更新属性,但不能在access token中进行更新,我想在access token而不是ID token中更新自定义用户定义的声明。请参阅我问题中的更新2以了解详细信息和解决建议。该声明不在access token中。我想将自定义用户定义的声明添加到access token中。如何做到这一点。我尝试在azure ad应用程序中的可选声明下创建扩展属性,如屏幕截图所示。但是如何通过代码动态更新该属性值。1。该扩展声明将包含在ID令牌而不是访问令牌中。2.您可以使用microsoft graph管理特定用户的属性,但需要授予正确的权限:简而言之,您可以使用microsoft graph更新属性