Azure B2C自定义扩展属性未更新

时间:2019-08-22 15:55:34

标签: c# azure-ad-b2c

我试图在Azure AD B2C中为用户的自定义扩展属性添加/更新值。该属性是一个AccountNumber,类型为字符串。我正在使用两个不同的Azure环境。一个用于我的本地/临时环境,另一个用于客户的生产Azure环境。我的本地和暂存工作正常,但是我似乎无法通过生产实例来更新此属性,这使我认为我缺少Azure实例本身(而非代码)中的某种权限/配置,但是让我们看看。

以下是我在Azure中采取的步骤:

  1. 在B2C中,我已经设置了我的应用程序。对于“ API访问”部分,我有2个选择
    • 获取用户的id_token(openid)
    • 获取用户的刷新令牌(离线访问)
  2. 我有两个用户流,两个用户流都返回AccountNumber作为声明。
  3. 在应用注册中(不是旧版),我也添加了我的应用。它确实有一个警告,说明尚未在B2C中得到支持,但是我在登台实例中也有此警告。对于为该应用程序选择的API权限,我具有以下内容。我来回添加了offline_access,openid和个人资料。 (所有都是经过Microsoft Graph授权的)

    • User.Read
    • User.ReadWrite
    • offline_access
    • openid
    • 个人资料
  4. 在“应用程序注册/身份验证”标签中,我启用了隐式授权流程,并检查了访问令牌和ID令牌

  5. 我已经获取了b2c-extensions-app应用ID,并将其保存在我的代码中,用于更新扩展属性(删除了破折号)

Web.config

<add key="ida:NonAdminScopes" value="User.Read User.ReadWrite" />
<add key="ida:AdminScopes" value="Directory.AccessAsUser.All User.ReadWrite.All Group.ReadWrite.All" />

这是我要建立并提出要求的地方。是的,我意识到我正在以一种更加手动的方式进行操作,但是我也正在与Sitecore一起工作,这要求我保留一些较旧的dll,而这正是我在无奈的日子里登陆的地方。

private async Task<string> SendGraphPatchRequest(string json, string objectId)
        {
            var graphEndpoint = new Uri(string.Format("https://graph.microsoft.com/v1.0/{0}/users/{1}", Tenant, objectId));
            HttpResponseMessage response;

            using (var httpClient = new HttpClient { BaseAddress = graphEndpoint })
            {
                using (var requestMessage = new HttpRequestMessage(new HttpMethod("PATCH"), graphEndpoint))
                {
                    var token = await GetOrCreateAccessToken();

                    requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
                    if (!string.IsNullOrEmpty(json))
                    {
                        requestMessage.Content = new StringContent(json, Encoding.UTF8, "application/json");
                    }

                    response = await httpClient.SendAsync(requestMessage).ConfigureAwait(continueOnCapturedContext: false);

                    if (!response.IsSuccessStatusCode)
                    {
                        string error = await response.Content.ReadAsStringAsync();
                        Logger.Error(string.Format("Error -> RequestMessage: {0}", error));

                        object formatted = JsonConvert.DeserializeObject(error);
                        throw new WebException("Error Calling the Graph API: \n" + JsonConvert.SerializeObject(formatted, Formatting.Indented));
                    }
                }
            }

            return response.Content.ReadAsStringAsync().Result;
        }

正在创建访问令牌的行确实使用ClientCredentials

_accessToken = await _authContext.AcquireTokenAsync("https://graph.microsoft.com/", _credentials);

请求正文内容的示例

{"extension_[extensionAppId]_AccountNumber":"123456"}

当我尝试通过Postman发出此请求时(我有一行代码记录了根据上述代码段创建的令牌-不确定是否会实际工作),这是响应我回来了:

{
  "error": {
    "code": "Authorization_RequestDenied",
    "message": "Insufficient privileges to complete the operation.",
    "innerError": {
      "request-id": "####",
      "date": "2019-08-21T15:06:45"
    }
  }
}

1 个答案:

答案 0 :(得分:0)

对MS Graph API的App Reg权限不正确。 可能您已同意开发租户中的其他权限,然后在以后取消选择它们,但这不会删除同意。

由于您在代码中使用客户端凭据,因此在“应用程序”权限下添加了读/写目录,因此在此,已授权的权限将不起作用。保存新的权限后,还请单击“授予权限”。