Вход пользователя после успешного вызова внешнего внешнего провайдера на сервере - PullRequest
2 голосов
/ 05 ноября 2019

Я пытаюсь настроить свое серверное веб-приложение для входа с использованием внешнего поставщика входа в систему (в данном случае Discord). Я использую https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers для моих провайдеров oauth. Стоит отметить, что это приложение предназначено для только использования внешнего поставщика Discord, нет регулярной функции входа в систему с использованием имени пользователя / пароля.

Это то, что у меня есть в моем автозагрузке. Метод cs ConfigureServices для настройки аутентификации, авторизации и диссонанса oauth middleware:

             services.AddIdentity<ApplicationUser, IdentityRole>(options =>
             {
                 options.User.RequireUniqueEmail = false;
                 options.Password.RequireDigit = false;
                 options.Password.RequiredLength = 4;
                 options.Password.RequiredUniqueChars = 0;
                 options.Password.RequireNonAlphanumeric = false;
                 options.Password.RequireLowercase = false;
                 options.Password.RequireUppercase = false;
                 options.Lockout.AllowedForNewUsers = false;
             }).AddEntityFrameworkStores<ApplicationDbContext>();

            services.AddAuthorization();
            services.AddAuthentication().AddDiscord(x =>
            {
                x.ClientId = Configuration["AppId"];
                x.ClientSecret = Configuration["AppSecret"];
                x.Scope.Add("guilds");
                x.Scope.Add("identify");
                x.Validate();
            });

, и это то, что у меня есть в моем методе Configure

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            // environment stuff

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseCookiePolicy();
            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapBlazorHub();
                endpoints.MapFallbackToPage("/_Host");
            });

        }

По любой причине, когда я выполняювыполнить вызов (который успешно перенаправляет на вход в систему с диска, который затем перенаправляет обратно на / sigin-discord), он не входит в систему пользователя.

Это мой контроллер идентификации, который обрабатывает вход в систему, после того, как вызов произошел, пользователь отправляется на / sigin-discord, который затем перенаправляет на / sigin, чтобы либо войти в систему пользователя, либо создать учетную запись. для них, если они еще не имеют.

        [HttpGet("login")]
        public async Task login(string redirectUrl)
        {
            string redirectUri = Url.Action("ExternalLoginCallback","Identity",new { returnUrl = redirectUrl});

            var properties = await signInManager.GetExternalAuthenticationSchemesAsync();

            await HttpContext.ChallengeAsync(properties.FirstOrDefault().Name, new AuthenticationProperties { RedirectUri = redirectUri });
        }

        [HttpGet("signin")]
        public async Task ExternalLoginCallback(string returnUrl)
        {
            returnUrl = returnUrl ?? "/";
            var info = await signInManager.GetExternalLoginInfoAsync();
            if (info == null)
            {
                HttpContext.Response.Redirect(returnUrl);
            }
            var result = await signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, true);
            if (result.Succeeded)
            {
                HttpContext.Response.Redirect(returnUrl);
            }
            else
            {
                var username = info.Principal.FindFirstValue(ClaimTypes.Name);
                if (username != null)
                {
                    var user = await UserManager.FindByNameAsync(info.Principal.Identity.Name);
                    if (user == null)
                    {
                        user = new ApplicationUser(info.Principal.FindFirstValue(ClaimTypes.Name), Convert.ToUInt64(info.ProviderKey));
                        await UserManager.CreateAsync(user);
                    }
                    await UserManager.AddLoginAsync(user, info);
                    await signInManager.SignInAsync(user, true);
                }
                HttpContext.Response.Redirect(returnUrl);
            }

Однако. SignInManager.GetExternalLoginInfoAsync () всегда возвращает значение NULL, даже если я успешно выполнил задание.

Кто-нибудь еще пытался использовать внешний поставщик для входа в систему с Blazor? Если так, у кого-нибудь есть идея, почему это не работает?

...