Aangepaste claims aanvragen met MSAL voor iOS en macOS

Met OpenID Connect kunt u eventueel het retourneren van afzonderlijke claims aanvragen bij het Eindpunt userInfo en/of in het id-token. Een claimaanvraag wordt weergegeven als een JSON-object dat een lijst met aangevraagde claims bevat. Zie OpenID Connect Core 1.0 voor meer informatie.

Met de Microsoft Authentication Library (MSAL) voor iOS en macOS kunnen specifieke claims worden aangevraagd in zowel interactieve als stille tokenverwervingsscenario's. Dit doet u via de claimsRequest parameter.

Er zijn meerdere scenario's waarin dit nodig is. Voorbeeld:

  • Aanvragen van claims buiten de standaardset voor uw toepassing.
  • Het aanvragen van specifieke combinaties van de standaardclaims die niet met scopes voor uw toepassing kunnen worden opgegeven. Als een toegangstoken bijvoorbeeld wordt geweigerd vanwege ontbrekende claims, kan de toepassing de ontbrekende claims aanvragen met MSAL.

Note

MSAL slaat de toegangstokencache over wanneer een claimaanvraag wordt opgegeven. Het is belangrijk om alleen parameters op te geven wanneer er extra claims nodig zijn (in plaats van altijd dezelfde claimsRequest parameter op te geven claimsRequest in elke MSAL API-aanroep).

claimsRequest kan worden opgegeven in MSALSilentTokenParameters en MSALInteractiveTokenParameters:

/*!
 MSALTokenParameters is the base abstract class for all types of token parameters (silent and interactive).
 */
@interface MSALTokenParameters : NSObject

/*!
 The claims parameter that needs to be sent to authorization or token endpoint.
 If claims parameter is passed in silent flow, access token will be skipped and refresh token will be tried.
 */
@property (nonatomic, nullable) MSALClaimsRequest *claimsRequest;

@end

MSALClaimsRequest kan worden samengesteld vanuit een NSString-weergave van de JSON-claimaanvraag.

Objective-C:

NSError *claimsError = nil;
MSALClaimsRequest *request = [[MSALClaimsRequest alloc] initWithJsonString:@"{\"id_token\":{\"auth_time\":{\"essential\":true},\"acr\":{\"values\":[\"urn:mace:incommon:iap:silver\"]}}}" error:&claimsError];

Swift:

var requestError: NSError? = nil
let request = MSALClaimsRequest(jsonString: "{\"id_token\":{\"auth_time\":{\"essential\":true},\"acr\":{\"values\":[\"urn:mace:incommon:iap:silver\"]}}}",
                                        error: &requestError)

Het kan ook worden gewijzigd door aanvullende specifieke claims aan te vragen:

Objective-C:

MSALIndividualClaimRequest *individualClaimRequest = [[MSALIndividualClaimRequest alloc] initWithName:@"custom_claim"];
individualClaimRequest.additionalInfo = [MSALIndividualClaimRequestAdditionalInfo new];
individualClaimRequest.additionalInfo.essential = @1;
individualClaimRequest.additionalInfo.value = @"myvalue";
[request requestClaim:individualClaimRequest forTarget:MSALClaimsRequestTargetIdToken error:&claimsError];

Swift:

let individualClaimRequest = MSALIndividualClaimRequest(name: "custom-claim")
let additionalInfo = MSALIndividualClaimRequestAdditionalInfo()
additionalInfo.essential = 1
additionalInfo.value = "myvalue"
individualClaimRequest.additionalInfo = additionalInfo
do {
  try request.requestClaim(individualClaimRequest, for: .idToken)
} catch let error as NSError {
  // handle error here  
}
        

MSALClaimsRequest moet vervolgens worden ingesteld in de tokenparameters en worden verstrekt aan een van de MSAL-api's voor het verkrijgen van tokens:

Objective-C:

MSALPublicClientApplication *application = ...;
MSALWebviewParameters *webParameters = ...;

MSALInteractiveTokenParameters *parameters = [[MSALInteractiveTokenParameters alloc] initWithScopes:@[@"user.read"]
                                                                                  webviewParameters:webParameters];
parameters.claimsRequest = request;
    
[application acquireTokenWithParameters:parameters completionBlock:completionBlock];

Swift:

let application: MSALPublicClientApplication!
let webParameters: MSALWebviewParameters!
        
let parameters = MSALInteractiveTokenParameters(scopes: ["user.read"], webviewParameters: webParameters)
parameters.claimsRequest = request
        
application.acquireToken(with: parameters) { (result: MSALResult?, error: Error?) in            ...