/// <summary>
        /// 自动注册外部登陆组件
        /// </summary>
        /// <param name="builder"></param>
        public static void AddExternalLogin(this AuthenticationBuilder builder, IConfiguration configuration)
        {
            UHubOptions options = new UHubOptions();

            configuration.GetSection("UHub").Bind(options);

            // 所有启用的外部登陆
            IList <UHubOptions.ExternalLoginModel> enabledExternalLogins = options.ExternalLogins?.Where(m => m.Enabled)?.ToList();

            if (enabledExternalLogins != null && enabledExternalLogins.Count >= 1)
            {
                // 反射找外部登陆类, 并添加
                Type        needInterface        = typeof(IExternalLogin);
                string      path                 = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
                Assembly[]  referencedAssemblies = System.IO.Directory.GetFiles(path, "*.dll").Select(Assembly.LoadFrom).ToArray();
                List <Type> types                = referencedAssemblies.SelectMany(m => m.ExportedTypes).ToList();
                List <Type> externalLoginType    = types.Where(m =>
                                                               (!m.IsAbstract && !m.IsInterface)
                                                               &&
                                                               (m.BaseType == needInterface || m.GetInterfaces().Contains(needInterface))
                                                               ).ToList();
                foreach (Type type in externalLoginType)
                {
                    IExternalLogin login       = Activator.CreateInstance(type) as IExternalLogin;
                    var            loginConfig = enabledExternalLogins.FirstOrDefault(m => m.Name == login.Name);
                    if (loginConfig != null)
                    {
                        builder = login.Add(builder, clientId: loginConfig.ClientId, clientSecret: loginConfig.ClientSecret);
                    }
                }
            }
        }
        public async Task <ClaimsIdentity> RedeemToken(IExternalLogin login)
        {
            var provider = this.providers.Single(o => o.ProviderId == login.ProviderId);

            var token = await provider.GetProfileDataFromProvider(login.AccessToken);

            if (token.aud != provider.ClientId)
            {
                return(null);
            }

            User user = (from p in this.db.User.Include(o => o.Providers).Include(o => o.Roles)
                         where p.Username == token.email
                         select p).FirstOrDefault();

            if (user == null)
            {
                user = await Task.Factory.StartNew(() => SignupUser(token.email));

                db.SaveChanges();
            }

            if (!user.Providers.Any(o => o.ProviderId == provider.ProviderId && o.ExternalId == token.sub))
            {
                db.UserProvider.Add(new UserProvider()
                {
                    ExternalId = token.sub,
                    ProviderId = provider.ProviderId,
                    User       = user
                });
                db.SaveChanges();
            }

            return(user.ToClaimsIdentity());
        }
示例#3
0
        public static ExternalLoginDto BuildDto(Guid userOrMemberKey, IExternalLogin entity, int?id = null)
        {
            var dto = new ExternalLoginDto
            {
                Id = id ?? default,
                UserOrMemberKey = userOrMemberKey,
                LoginProvider   = entity.LoginProvider,
                ProviderKey     = entity.ProviderKey,
                UserData        = entity.UserData,
                CreateDate      = DateTime.Now
            };

            return(dto);
        }
        public async Task <ClaimsIdentity> RedeemToken(IExternalLogin login)
        {
            var provider = this.providers.Single(o => o.ProviderId == login.ProviderId);

            var token = await provider.GetProfileDataFromProvider(login.AccessToken);

            if (token.aud != provider.ClientId)
            {
                return(null);
            }

            User user = this.db.User.FirstOrDefault(o => o.Username == token.email);

            if (user == null)
            {
                user = await Task.Factory.StartNew(() => SignupUser(token.email));

                db.SaveChanges();
            }

            if (!user.Providers.Any(o => o.ProviderId == provider.ProviderId && o.ExternalId == token.sub))
            {
                db.UserProvider.Add(new UserProvider()
                {
                    ExternalId = token.sub,
                    ProviderId = provider.ProviderId,
                    User       = user
                });

                db.SaveChanges();
            }

            string fingerprint = this.deviceProfiler.DeriveFingerprint(user);

            return(user.ToClaimsIdentity(this.config.ClaimsNamespace, fingerprint));
        }
示例#5
0
        private void setPasswordSent(IDalSession session, IExternalLogin login, bool passwordSent)
        {
            bool isActive = passwordSent;
            SecurityManager.SetActive(login.UserName, isActive);

            login.IsActive = isActive;
            login.PasswordSent = passwordSent;
            LoginMapper.Update(session, login);
        }