public async Task <ActionResult> Execute(AuthorizationParameter authorizationParameter, IPrincipal principal, Client client) { if (authorizationParameter == null) { throw new ArgumentNullException(nameof(authorizationParameter)); } if (client == null) { throw new ArgumentNullException(nameof(client)); } var claimsPrincipal = principal == null ? null : principal as ClaimsPrincipal; _simpleIdentityServerEventSource.StartAuthorizationCodeFlow( authorizationParameter.ClientId, authorizationParameter.Scope, authorizationParameter.Claims == null ? string.Empty : authorizationParameter.Claims.ToString()); var result = await _processAuthorizationRequest.ProcessAsync(authorizationParameter, claimsPrincipal, client); if (!_clientValidator.CheckGrantTypes(client, GrantType.authorization_code)) { throw new IdentityServerExceptionWithState( ErrorCodes.InvalidRequestCode, string.Format(ErrorDescriptions.TheClientDoesntSupportTheGrantType, authorizationParameter.ClientId, "authorization_code"), authorizationParameter.State); } if (result.Type == TypeActionResult.RedirectToCallBackUrl) { if (claimsPrincipal == null) { throw new IdentityServerExceptionWithState( ErrorCodes.InvalidRequestCode, ErrorDescriptions.TheResponseCannotBeGeneratedBecauseResourceOwnerNeedsToBeAuthenticated, authorizationParameter.State); } await _generateAuthorizationResponse.ExecuteAsync(result, authorizationParameter, claimsPrincipal, client); } var actionTypeName = Enum.GetName(typeof(TypeActionResult), result.Type); _simpleIdentityServerEventSource.EndAuthorizationCodeFlow( authorizationParameter.ClientId, actionTypeName, result.RedirectInstruction == null ? string.Empty : Enum.GetName(typeof(IdentityServerEndPoints), result.RedirectInstruction.Action)); return(result); }