Anfordern von benutzerdefinierten Ansprüchen mithilfe von MSAL für iOS und macOS

OpenID Connect ermöglicht es Ihnen, optional die Rückgabe einzelner Ansprüche vom UserInfo-Endpunkt und/oder im ID-Token anzufordern. Eine Anspruchsanforderung wird als JSON-Objekt dargestellt, das eine Liste der angeforderten Ansprüche enthält. Weitere Informationen finden Sie unter OpenID Connect Core 1.0 .

Mit der Microsoft Authentication Library (MSAL) (MSAL) für iOS und macOS können Sie spezifische Ansprüche sowohl in interaktiven als auch in automatischen Tokenabrufszenarios anfordern. Dies erfolgt über den claimsRequest Parameter.

Es gibt mehrere Szenarien, in denen dies erforderlich ist. Beispiel:

  • Zum Anfordern von Ansprüchen, die nicht als Standardansprüche für Ihre Anwendung festgelegt sind.
  • Zum Anfordern von bestimmten Kombinationen der Standardansprüche, die nicht mithilfe von Bereichen für Ihre Anwendung angegeben werden können. Wenn beispielsweise ein Zugriffstoken aufgrund fehlender Ansprüche abgelehnt wird, kann die Anwendung die fehlenden Ansprüche mithilfe von MSAL anfordern.

Note

MSAL umgeht den Zugriffstokencache, wenn eine Anspruchsanforderung angegeben wird. Es ist wichtig, den claimsRequest-Parameter nur dann bereitzustellen, wenn zusätzliche Claims erforderlich sind (anstatt bei jedem MSAL-API-Aufruf denselben claimsRequest-Parameter bereitzustellen).

claimsRequest kann in MSALSilentTokenParameters und MSALInteractiveTokenParameters angegeben werden:

/*!
 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 kann aus einer NSString-Darstellung der JSON-Anspruchsanforderung erstellt werden.

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)

Sie kann auch geändert werden, indem sie zusätzliche spezifische Ansprüche anfordert:

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 sollte dann in den Tokenparametern festgelegt und einer der MSAL-Token-Käufe-APIs bereitgestellt werden:

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            ...