/// <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()); }
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)); }
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); }