无法通过azure函数填充自定义azure B2C属性

无法通过azure函数填充自定义azure B2C属性,azure,azure-active-directory,Azure,Azure Active Directory,我一直在尝试创建一个自定义策略,该策略在登录时调用azure函数,然后填充自定义属性 我一直在遵循这个指南 这是我的trustframeworkextension.xml <ClaimsProvider> <DisplayName>Azure-Functions-Get-External-System-Id-On-Registration</DisplayName> <TechnicalProfiles> <Technic

我一直在尝试创建一个自定义策略,该策略在登录时调用azure函数,然后填充自定义属性

我一直在遵循这个指南

这是我的trustframeworkextension.xml

  <ClaimsProvider>
  <DisplayName>Azure-Functions-Get-External-System-Id-On-Registration</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="Azure-Functions-Get-External-System-Id-On-Registration">
      <DisplayName>Get external system ID for the user on registration</DisplayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <Metadata>
        <Item Key="ServiceUrl">
        https://azureb2ccreatecrmcontact.azurewebsites.net/api/CreateCrmContact?code=app-function-code
        </Item>
        <Item Key="AuthenticationType">None</Item>
        <Item Key="SendClaimsIn">Body</Item>
        <Item Key="AllowInsecureAuthInProduction">true</Item>
      </Metadata>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" />
        <InputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name" />
        <InputClaim ClaimTypeReferenceId="surname" PartnerClaimType="family_name" />
      </InputClaims>
     <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="extension_external_system_id" PartnerClaimType="external_system_id" />
      </OutputClaims>
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
    </TechnicalProfile>
    <TechnicalProfile Id="LocalAccountSignUpWithLogonEmail">
      <ValidationTechnicalProfiles>
        <ValidationTechnicalProfile ReferenceId="Azure-Functions-Get-External-System-Id-On-Registration" />
      </ValidationTechnicalProfiles>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>
我只能在jwt响应令牌中看到填充的默认值

"extension_external_system_id": "external_system_id_1234"
任何朝着正确方向的推进都是一件好事。谢谢

我的功能代码

public static class Function1
{
    [FunctionName("CreateCrmContact")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        string name = req.Query["name"];

        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        var email = data?.email;
        var firstName = data?.given_name;
        var lastName = data?.family_name;
        Guid contactId = new Guid();
        if (email == null || email == String.Empty)
        {
            new BadRequestObjectResult("Please pass user email in the request body");
        }
        log.LogInformation($"Email : {email}");
        log.LogInformation($"Firstname : {firstName}");
        log.LogInformation($"Surname : {lastName}");
        using (var client = new HttpClient())
        {
            var dict = new Dictionary<string, string>();
            dict.Add("FirstName", (string)firstName);
            dict.Add("LastName", (string)lastName);
            dict.Add("Email", (string)email);
            var formEncoded = new FormUrlEncodedContent(dict);

            var response = await client.PostAsync(String.Format("apiuri"), formEncoded);
            var result = await response.Content.ReadAsStringAsync();
            var deserializedResponse = JsonConvert.DeserializeObject<APIResponse<MemberCreateResponse>>(result);
            log.LogInformation($"Contact created with id: {deserializedResponse.ResponseData.ContactId}");
            contactId = deserializedResponse.ResponseData.ContactId;
        }
        var sysInfo = new ExternalSystemInfo
        {
            external_system_id = contactId.ToString()
        };
        var serializedObj = JsonConvert.SerializeObject(sysInfo);
        log.LogInformation($"GetExternalSystemIdOnRegistration got external system id for user: {serializedObj}");
        return new OkObjectResult(sysInfo);
    }
}
class ExternalSystemInfo
{
    [JsonProperty("external_system_id")]
    public string external_system_id { get; set; }
}
公共静态类函数1
{
[FunctionName(“CreateCrmContact”)]
公共静态异步任务运行(
[HttpTrigger(AuthorizationLevel.Function,“get”,“post”,Route=null)]HttpRequest请求,
ILogger日志)
{
LogInformation(“C#HTTP触发器函数处理了一个请求。”);
字符串名称=请求查询[“名称”];
string requestBody=等待新的StreamReader(req.Body).ReadToEndAsync();
动态数据=JsonConvert.DeserializeObject(requestBody);
var电子邮件=数据?电子邮件;
var firstName=数据?给定的名称;
var lastName=数据?.family_name;
Guid contactId=新Guid();
if(email==null | | email==String.Empty)
{
新的BadRequestObjectResult(“请在请求正文中传递用户电子邮件”);
}
log.LogInformation($“Email:{Email}”);
log.LogInformation($“Firstname:{Firstname}”);
log.LogInformation($“姓氏:{lastName}”);
使用(var client=new HttpClient())
{
var dict=新字典();
dict.Add(“FirstName”,(字符串)FirstName);
dict.Add(“LastName”,(字符串)LastName);
dict.Add(“电子邮件”,(字符串)电子邮件);
var formEncoded=新FormUrlEncodedContent(dict);
var response=wait client.PostAsync(String.Format(“apuri”),formEncoded);
var result=await response.Content.ReadAsStringAsync();
var deserializedResponse=JsonConvert.DeserializeObject(结果);
log.LogInformation($“使用id创建的联系人:{deserializedResponse.ResponseData.ContactId}”);
contactId=反序列化响应.ResponseData.contactId;
}
var sysInfo=新的外部系统信息
{
外部\u系统\u id=contactId.ToString()
};
var serializedObj=JsonConvert.SerializeObject(sysInfo);
log.LogInformation($“GetExternalSystemIdOnRegistration获取了用户的外部系统id:{serializedObj}”);
返回新的OkObjectResult(sysInfo);
}
}
类外部系统信息
{
[JsonProperty(“外部系统id”)]
公共字符串外部_系统_id{get;set;}
}

如果您完全遵循本文,则返回参数的名称必须精确设置为:“外部系统id”。在AD B2C自定义策略中,我们将其设置为“PartnerClaimType”,策略期望响应参数具有这样的名称

现在检查您的Azure AD B2C自定义策略:

<OutputClaims>
    <OutputClaim ClaimTypeReferenceId="extension_external_system_id" PartnerClaimType="extension_external_system_id" />
</OutputClaims>


您应该将PartnerClaimType的值设置为“外部系统id”,而不是“扩展外部系统id”。

。谢谢你的评论。这是我最初尝试的,但是没有成功。根据你的评论,我刚刚再试了一次,但仍然没有返回预期值。我已经更新了原始帖子中的代码,以反映这些更改。我还添加了我的azure函数代码。
<OutputClaims>
    <OutputClaim ClaimTypeReferenceId="extension_external_system_id" PartnerClaimType="extension_external_system_id" />
</OutputClaims>