簡體   English   中英

通過圖 Api 在 Azure ADB2C 中添加自定義聲明

[英]Add custom claim in Azure ADB2C through Graph Api

我想向管理員通過圖表 api 管理的某些特定用戶的令牌添加自定義聲明。

基本場景如下:

用戶注冊了我的應用程序。 最初所有用戶對資源的訪問都是有限的。 作為管理員,我將通過添加特定聲明來更新一些用戶,以便我的應用程序將授權用戶使用特定資源。

根據我的理解,有幾種方法可以在令牌中包含聲明(擴展屬性)。

  1. 通過 azure 門戶創建用戶屬性,並在注冊策略中使用它來收集用戶的值。 就我而言,自定義屬性將僅由管理員應用,因此我不會讓用戶管理此聲明。 所以這對我來說不是一個好方法,而且對我來說也沒有意義,因為我將在許多用戶已經注冊后添加新屬性,因此將無法收集這些信息。

  2. 另一種方法是通過圖 Api 添加擴展屬性。為此,我需要創建一個新應用(通過應用注冊)並通過圖 api 向該應用注冊擴展屬性。然后通過添加新的方式更新用戶(通過圖 api)在該應用程序中創建了擴展屬性。 最后,我希望這個擴展屬性會出現在我的令牌中,但沒有機會。 它在門戶中不可見,在令牌中但僅在圖表 api 響應中可見。

  3. 創建我不想創建的自定義策略,因為不建議非專家使用。

我在第二個解決方案中缺少什么?

在您的第二個解決方案中,您應該考慮擴展行為和限制。 由於它在MSDN 中提到,您的問題可能與屬性類型有關。 圖 API 和 ADB2C 期望擴展字段可以為空。 我不知道你是否是這種情況,但我希望這會有所幫助。

StackOverflow 中也已經有問答

擴展屬性未顯示在用戶流的令牌中的原因是用戶流使用不同的擴展應用程序。

自定義屬性是在應用程序(稱為extension app )上創建的。 在用戶流中,AAD B2C 會自動創建該應用程序(它被命名為B2C extension app, do not delete )。

當您創建“新應用程序”時,該應用程序未在用戶流中注冊。

您的解決方案是使用B2C extension app來創建屬性。 或者在門戶中創建屬性。 然后使用圖形 api 用這些新屬性修補用戶。

請參閱在 AAD B2C 租戶中的 AAD Graph 中使用自定義屬性的文檔。 請參閱此問題以獲取有關自定義 /extension 屬性的更多參考。

讓我在這里澄清一些事情,因為它可能會造成混淆。

使用用戶流時,定義自定義屬性的最簡單方法是使用 Azure 門戶。 您必須在 Azure AD B2C 和 select用戶屬性中打開用戶流刀片:

在此處輸入圖像描述

添加自定義屬性后,它將在列表中可見。 從這一點開始,您可以決定是否應將其作為令牌返回給應用程序。 要在令牌中包含自定義屬性值,您必須打開應用程序聲明選項卡和 select 您之前添加的自定義屬性:

在此處輸入圖像描述

現在說到屬性值。 您提到您希望以管理員身份使用 Graph API 來實現此值。這是我的 web 應用程序的片段,用於使用.NET Microsoft Graph Client管理用戶:

    public async Task UpdateUserAsync(UserAccount userAccount, CancellationToken cancellationToken)
    {
        try
        {
            string myCustomAttributeForUserAttributeName = _adB2cCustomAttributeHelper.GetCompleteAttributeName("myCustomAttributeForUser");

            IDictionary<string, object> extensionsInstance = new Dictionary<string, object>();
            if (userAccount.myCustomAttributeForUser != null)
            {
                extensionsInstance.Add(myCustomAttributeForUserAttributeName, userAccount.myCustomAttributeForUser);
            }

            var user = new User
            {
                AdditionalData = extensionsInstance
            };

        await _graphServiceClient.Users[existingUser.Id]
                      .Request()
                      .UpdateAsync(user, cancellationToken);
        }

        catch (ServiceException ex)
        {
            if (ex.StatusCode == System.Net.HttpStatusCode.TooManyRequests)
            {
                var retryAfter = ex.ResponseHeaders.RetryAfter.Delta.Value;
                ...
            }

            else
            {
                _logger.LogError...
            }
        }
    }

重要的

在上面的源代碼中,如您所見,我正在使用_adB2cCustomAttributeHelper insatnce。 這是因為當您使用 Microsoft Graph API 時,您必須提供自定義屬性的全名,其中還包括在 Azure AD B2C 中注冊的擴展應用程序 ID:

在此處輸入圖像描述

在此處輸入圖像描述

您可以在此處閱讀更多相關信息。 自定義屬性以這種格式存儲(沒有“-”):

extension_<<extension_app_client_id>_AttributeName

這是AdB2cCustomAttributeHelper class 定義:

公共 class AdB2cCustomAttributeHelper { 內部只讀字符串 _b2cExtensionAppClientId;

    public AdB2cCustomAttributeHelper(string b2cExtensionAppClientId)
    {
        _b2cExtensionAppClientId = b2cExtensionAppClientId.Replace("-", "");
    }

    internal string GetCompleteAttributeName(string attributeName)
    {
        if (string.IsNullOrWhiteSpace(attributeName))
        {
            throw new System.ArgumentException("Parameter cannot be null", nameof(attributeName));
        }

        return $"extension_{_b2cExtensionAppClientId}_{attributeName}";
    }
}

我將上面的實例注冊為 singleton,並將擴展應用程序 ID 作為參數傳遞給它:

  services.AddSingleton(implementationFactory =>
     {
        var options = implementationFactory.GetRequiredService<IOptions<MsGraphServiceConfiguration>>();

        return new AdB2cCustomAttributeHelper(options.Value.ADB2CExtensionAppId);
        });

鏈接下,您還可以看到另一個使用 Microsoft Graph API 向用戶帳戶添加擴展屬性的示例。

登錄時,您將在令牌中看到擴展屬性:

在此處輸入圖像描述

我不同意@Abhishek Agrawal,我使用帶有B2C 擴展應用程序的圖形創建了自定義屬性,不要刪除並向某些用戶添加一些值,之后我運行用戶流程,登錄並且自定義屬性沒有出現在令牌中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM