public Task UpdateRoles(UpdateRolesContext context) { return(_workflowManager.TriggerEventAsync(nameof(UserLoggedInEvent), input: new { context.User, context.ExternalClaims, context.UserRoles }, correlationId: ((User)context.User).Id.ToString() )); }
private async Task <SignInResult> ExternalLoginSignInAsync(IUser user, ExternalLoginInfo info) { var claims = info.Principal.GetSerializableClaims(); var userRoles = await _userManager.GetRolesAsync(user); var context = new UpdateRolesContext(user, info.LoginProvider, claims, userRoles); string[] rolesToAdd = new string[0]; string[] rolesToRemove = new string[0]; var loginSettings = (await _siteService.GetSiteSettingsAsync()).As <LoginSettings>(); if (loginSettings.UseScriptToSyncRoles) { try { var jsonSerializerSettings = new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var script = $"js: function syncRoles(context) {{\n{loginSettings.SyncRolesScript}\n}}\nvar context={JsonConvert.SerializeObject(context, jsonSerializerSettings)};\nsyncRoles(context);\nreturn context;"; dynamic evaluationResult = _scriptingManager.Evaluate(script, null, null, null); rolesToAdd = (evaluationResult.rolesToAdd as object[]).Select(i => i.ToString()).ToArray(); rolesToRemove = (evaluationResult.rolesToRemove as object[]).Select(i => i.ToString()).ToArray(); } catch (Exception ex) { _logger.LogError(ex, "Error Syncing Roles From External Provider {0}", info.LoginProvider); } } else { foreach (var item in _externalLoginHandlers) { try { await item.UpdateRoles(context); } catch (Exception ex) { _logger.LogError(ex, "{externalLoginHandler} - IExternalLoginHandler.UpdateRoles threw an exception", item.GetType()); } } rolesToAdd = context.RolesToAdd; rolesToRemove = context.RolesToRemove; } await _userManager.AddToRolesAsync(user, rolesToAdd.Distinct()); await _userManager.RemoveFromRolesAsync(user, rolesToRemove.Distinct()); return(await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent : false, bypassTwoFactor : true)); }
private async Task <SignInResult> ExternalLoginSignInAsync(IUser user, ExternalLoginInfo info) { var claims = info.Principal.GetSerializableClaims(); var userRoles = await _userManager.GetRolesAsync(user); var context = new UpdateRolesContext(user, info.LoginProvider, claims, userRoles); foreach (var item in _externalLoginHandlers) { try { await item.UpdateRoles(context); } catch (Exception ex) { _logger.LogError(ex, "{externalLoginHandler} - IExternalLoginHandler.UpdateRoles threw an exception", item.GetType()); } } await _userManager.AddToRolesAsync(user, context.RolesToAdd.Distinct()); await _userManager.RemoveFromRolesAsync(user, context.RolesToRemove.Distinct()); var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent : false, bypassTwoFactor : true); if (result.Succeeded) { await _accountEvents.InvokeAsync((e, user) => e.LoggedInAsync(user), user, _logger); var identityResult = await _signInManager.UpdateExternalAuthenticationTokensAsync(info); if (!identityResult.Succeeded) { _logger.LogError("Error updating the external authentication tokens."); } } else { await _accountEvents.InvokeAsync((e, user) => e.LoggingInFailedAsync(user), user, _logger); } return(result); }