Ejemplo n.º 1
0
        private async Task <SignInViewModel> CreateSigninModelAsync(string returnUrl)
        {
            var context = await interactions.GetAuthorizationContextAsync(returnUrl);

            if (null != context?.IdP)
            {
                return(new SignInViewModel
                {
                    EnableLocalLogin = false,
                    ReturnUrl = returnUrl,
                    Email = context.LoginHint,
                    ExternalProviders =
                    {
                        new ExternalProvider
                        {
                            AuthenticationScheme = context.IdP
                        }
                    }
                });
            }

            var schemes = await schemeProvider.GetAllSchemesAsync();

            var comparer  = StringComparer.OrdinalIgnoreCase;
            var condition = new Func <AuthenticationScheme, bool>(scheme =>
                                                                  null != scheme.DisplayName || comparer.Equals(scheme.Name, AccountOptions.WindowsAuthenticationScheme)
                                                                  );
            var canSigninLocal = true;
            var providers      = schemes
                                 .Where(condition)
                                 .Select(scheme => new ExternalProvider
            {
                DisplayName          = scheme.DisplayName,
                AuthenticationScheme = scheme.Name
            })
                                 .ToArray();

            if (null != context?.ClientId)
            {
                var client = await clientStore.FindEnabledClientByIdAsync(context.ClientId);

                if (null != client)
                {
                    canSigninLocal = client.EnableLocalLogin;

                    if (null != client.IdentityProviderRestrictions && client.IdentityProviderRestrictions.Any())
                    {
                        providers = providers
                                    .Where(provider =>
                                           client.IdentityProviderRestrictions.Contains(provider.AuthenticationScheme)
                                           )
                                    .ToArray();
                    }
                }
            }

            captcha.Create(HttpContext);

            return(new SignInViewModel
            {
                AllowRememberMe = AccountOptions.AllowRememberMe,
                EnableLocalLogin = canSigninLocal && AccountOptions.AllowLocalLogin,
                ReturnUrl = returnUrl,
                Email = context?.LoginHint,
                ExternalProviders = providers
            });
        }