我一直在尝试创建一个自定义策略,该策略在登录时会调用azure函数,然后填充一个自定义属性。
我一直在遵循本指南https://daniel-krzyczkowski.github.io/Azure-AD-B2C-Series-External-Service-Call/
这是我的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>
这是我函数的返回值。我可以通过监视器确认它在注册过程中被触发,但是没有填充自定义属性。 这是我的功能根据监视器日志返回的内容
{"extension_external_system_id":"c87f6324-012d-ea11-a810-000d3a7940d5"}
我只能在我的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; }
}