public Task UpdateRoles(UpdateRolesContext context)
 {
     return(_workflowManager.TriggerEventAsync(nameof(UserLoggedInEvent),
                                               input: new { context.User, context.ExternalClaims, context.UserRoles },
                                               correlationId: ((User)context.User).Id.ToString()
                                               ));
 }
예제 #2
0
        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));
        }
예제 #3
0
        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);
        }