Проверьте претензии (электронная почта) перед созданием нового куки, без asp.Базовое хранилище идентификаторов с использованием asp net core social login - PullRequest
2 голосов
/ 24 июня 2019

Я работаю над своим хобби-проектом, где я реализовал социальный вход в систему через Google.

Теперь я хочу предотвратить это, чтобы только определенный пользователь мог войти в приложение, так как я обнаружил, что нет способа ограничить это на стороне Google OAuth, поэтому я добавил таблицу для хранения электронной почты и роли.

если адрес электронной почты не найден в этой таблице, я хочу запретить подписи пользователя.

            services
           .AddAuthentication(options =>
           {
               options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
           })
           .AddCookie()
           .AddGoogle(googleOption =>
           {

               googleOption.ClientId = Configuration["Authentication:Google:ClientID"]; ;
               googleOption.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
               googleOption.Events.OnRemoteFailure = (context) =>
               {
                   context.HandleResponse();
                   return context.Response.WriteAsync("<script>window.close();</script>");
               };
               googleOption.Events = new Microsoft.AspNetCore.Authentication.OAuth.OAuthEvents
               {
                   OnTicketReceived = async ctx =>
                   {
                       string emailAddress = ctx.Principal.
                                               FindFirstValue("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress");
                       var db = ctx.HttpContext.RequestServices.GetRequiredService<DbContext>();
                       var roles = await db.EmailRoles.Where(c => c.Email == emailAddress).ToListAsync();
                       if (roles.Count > 1)                           
                       {
                           var claims = new List<Claim>();
                           foreach (var item in roles)
                           {
                               claims.Add(new Claim(ClaimTypes.Role, item.Role));
                           }
                           var appIdentity = new ClaimsIdentity(claims);
                           ctx.Principal.AddIdentity(appIdentity);
                       }
                   }
               };
           });

1 Ответ

1 голос
/ 25 июня 2019

Я думаю, что вы ищете OnCreatingTicket.это позволит вам проверять пользователей при их входе в систему. В этом примере только электронным письмам на gmail.com будет разрешено входить в систему, а кого-либо другого выгнали бы

 services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        })
        .AddCookie()
        .AddGoogle("Google", options =>
        {
            options.ClientId = Configuration["Authentication:Google:ClientId"];
            options.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
            options.Events = new OAuthEvents
            {
                OnCreatingTicket = context =>
                {
                    string domain = context.User.Value<string>("domain");
                    if (domain != "gmail.com")
                        throw new GoogleAuthenticationException("You must sign in with a gmail.com email address");

                    return Task.CompletedTask;
                }
            };
        });
...