private async Task <IEnumerable <ExternalProvider> > GetExternalLoginsAsync(string returnUrl) { var externalProviders = default(IEnumerable <ExternalProvider>); var context = await Interaction.GetAuthorizationContextAsync(returnUrl); if (context?.IdP != null && await SchemeProvider.GetSchemeAsync(context.IdP) != null) { var enableLocalLogin = context.IdP == IdentityServer4.IdentityServerConstants.LocalIdentityProvider; externalProviders = !enableLocalLogin ? new ExternalProvider[] { new ExternalProvider { AuthenticationScheme = context.IdP } } : new ExternalProvider[] { }; } externalProviders = (await SchemeProvider.GetAllSchemesAsync()) .Where((authenticationScheme) => authenticationScheme.DisplayName != null) .Select ( (authenticationScheme) => new ExternalProvider { DisplayName = authenticationScheme.DisplayName ?? authenticationScheme.Name, AuthenticationScheme = authenticationScheme.Name } ).ToList(); var allowLocal = true; if (context?.Client.ClientId != null) { var client = await Clients.FindEnabledClientByIdAsync(context.Client.ClientId); if (client != null) { allowLocal = client.EnableLocalLogin; if (client.IdentityProviderRestrictions != null && client.IdentityProviderRestrictions.Any()) { externalProviders = externalProviders.Where(provider => client.IdentityProviderRestrictions.Contains(provider.AuthenticationScheme)).ToList(); } } } return(externalProviders.ToArray()); }
private async Task <RegisterViewModel> BuildRegisterViewModelAsync(string returnUrl) { var context = await Interaction.GetAuthorizationContextAsync(returnUrl); if (context?.IdP != null && await SchemeProvider.GetSchemeAsync(context.IdP) != null) { var local = context.IdP == IdentityServer4.IdentityServerConstants.LocalIdentityProvider; // this is meant to short circuit the UI and only trigger the one external IdP var viewModel = new RegisterViewModel { EnableLocalLogin = local, Email = context?.LoginHint, ReturnUrl = returnUrl, ExternalProviders = !local ? new [] { new ExternalProvider { AuthenticationScheme = context.IdP } } : Enumerable.Empty <ExternalProvider>() }; return(viewModel); } var schemes = await SchemeProvider.GetAllSchemesAsync(); var externalProviders = schemes .Where((authenticationScheme) => authenticationScheme.DisplayName != null) .Select ( (authenticationScheme) => new ExternalProvider { DisplayName = authenticationScheme.DisplayName ?? authenticationScheme.Name, AuthenticationScheme = authenticationScheme.Name } ).ToList(); var allowLocal = true; if (context?.Client.ClientId != null) { var client = await Clients.FindEnabledClientByIdAsync(context.Client.ClientId); if (client != null) { allowLocal = client.EnableLocalLogin; if (client.IdentityProviderRestrictions != null && client.IdentityProviderRestrictions.Any()) { externalProviders = externalProviders .Where ( (externalProvider) => client.IdentityProviderRestrictions.Contains(externalProvider.AuthenticationScheme) ) .ToList(); } } } return(new RegisterViewModel { AllowRememberLogin = AccountOptions.AllowRememberLogin, EnableLocalLogin = allowLocal && AccountOptions.AllowLocalLogin, Email = context?.LoginHint, ReturnUrl = returnUrl, ExternalProviders = externalProviders.ToArray() }); }
/*****************************************/ /* helper APIs for the AccountController */ /*****************************************/ private async Task <LoginViewModel> BuildLoginViewModelAsync(string returnUrl) { var context = await Interaction.GetAuthorizationContextAsync(returnUrl); if (context?.IdP != null && await SchemeProvider.GetSchemeAsync(context.IdP) != null) { var local = context.IdP == IdentityServer4.IdentityServerConstants.LocalIdentityProvider; // this is meant to short circuit the UI and only trigger the one external IdP var vm = new LoginViewModel { EnableLocalLogin = local, ReturnUrl = returnUrl, Username = context?.LoginHint, }; if (!local) { vm.ExternalProviders = new[] { new ExternalProvider { AuthenticationScheme = context.IdP } }; } return(vm); } var schemes = await SchemeProvider.GetAllSchemesAsync(); var providers = schemes .Where(x => x.DisplayName != null || (x.Name.Equals(AccountOptions.WindowsAuthenticationSchemeName, StringComparison.OrdinalIgnoreCase)) ) .Select(x => new ExternalProvider { DisplayName = x.DisplayName, AuthenticationScheme = x.Name }).ToList(); var allowLocal = true; if (context?.ClientId != null) { var client = await ClientStore.FindEnabledClientByIdAsync(context.ClientId); if (client != null) { allowLocal = client.EnableLocalLogin; if (client.IdentityProviderRestrictions != null && client.IdentityProviderRestrictions.Any()) { providers = providers.Where(provider => client.IdentityProviderRestrictions.Contains(provider.AuthenticationScheme)).ToList(); } } } return(new LoginViewModel { AllowRememberLogin = AccountOptions.AllowRememberLogin, EnableLocalLogin = allowLocal && AccountOptions.AllowLocalLogin, ReturnUrl = returnUrl, Username = context?.LoginHint, ExternalProviders = providers.ToArray() }); }