无法通过azure函数填充自定义azure B2C属性
我一直在尝试创建一个自定义策略,该策略在登录时调用azure函数,然后填充自定义属性 我一直在遵循这个指南 这是我的trustframeworkextension.xml无法通过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
<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>