public ChannelFactoryService([ServiceDependency] IUserSessionService userSessionService, SecurityTokenCache tokenCache)
        {
            _userSessionService    = userSessionService;
            _channelPoolDictionary = new Dictionary <Type, object>();
            _tokenCache            = tokenCache;

            if (_tokenCache == null)
            {
                _tokenCache = new SecurityTokenCache();
            }

            ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback((sender, certificate, chain, sslPolicyErrors) =>
            {
                if (sslPolicyErrors == SslPolicyErrors.None)
                {
                    return(true);
                }
                else if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors)
                {
                    if (chain.ChainStatus.Count() == 1)
                    {
                        if (chain.ChainStatus[0].Status == X509ChainStatusFlags.UntrustedRoot || chain.ChainStatus[0].Status == X509ChainStatusFlags.PartialChain)
                        {
                            //Accept self-signed certificates
                            return(true);
                        }
                    }
                }

                return(false);
            });
        }
        public virtual async Task SendChangePhoneNumberCodeAsync(SendChangePhoneNumberCodeDto input)
        {
            var securityTokenCacheKey  = SmsSecurityTokenCacheItem.CalculateCacheKey(input.NewPhoneNumber, "SmsChangePhoneNumber");
            var securityTokenCacheItem = await SecurityTokenCache.GetAsync(securityTokenCacheKey);

            var interval = await SettingProvider.GetAsync(Settings.IdentitySettingNames.User.SmsRepetInterval, 1);

            if (securityTokenCacheItem != null)
            {
                throw new UserFriendlyException(L["SendRepeatPhoneVerifyCode", interval]);
            }

            // 是否已有用户使用手机号绑定
            if (await UserRepository.IsPhoneNumberConfirmedAsync(input.NewPhoneNumber))
            {
                throw new BusinessException(IdentityErrorCodes.DuplicatePhoneNumber);
            }
            var user = await UserManager.GetByIdAsync(CurrentUser.GetId());

            var template = await SettingProvider.GetOrNullAsync(Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed);

            var token = await UserManager.GenerateChangePhoneNumberTokenAsync(user, input.NewPhoneNumber);

            // 发送验证码
            await SecurityCodeSender.SendPhoneConfirmedCodeAsync(input.NewPhoneNumber, token, template);

            securityTokenCacheItem = new SmsSecurityTokenCacheItem(token, user.ConcurrencyStamp);
            await SecurityTokenCache
            .SetAsync(securityTokenCacheKey, securityTokenCacheItem,
                      new DistributedCacheEntryOptions
            {
                AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(interval)
            });
        }
        private string getSecurityToken()
        {
            SecurityTokenCache tokenCache = WorkItem.RootWorkItem.Items.FindByType <SecurityTokenCache>().Last();
            DateTime           validTo    = tokenCache.Token.ValidTo.ToLocalTime();

            if (DateTime.Now.CompareTo(validTo) >= 0)
            {
                MessageBox.Show(Resources.LoginSessionExpired_text);
                throw new SecurityTokenExpiredException();
            }
            return(tokenCache.GetTokenXmlAsString());
        }
        public PassiveRepositorySessionSecurityTokenCache(
            ITokenCacheRepository tokenCacheRepository, 
            SecurityTokenCache inner)
        {
            if (tokenCacheRepository == null) throw new ArgumentNullException("tokenCacheRepository");
            if (inner == null) throw new ArgumentNullException("inner");

            this.tokenCacheRepository = tokenCacheRepository;
            this.inner = inner;

            serializer = new SessionSecurityTokenCookieSerializer();
        }
        public virtual async Task ChangePhoneNumberAsync(ChangePhoneNumberDto input)
        {
            // 是否已有用户使用手机号绑定
            if (await UserRepository.IsPhoneNumberConfirmedAsync(input.NewPhoneNumber))
            {
                throw new BusinessException(IdentityErrorCodes.DuplicatePhoneNumber);
            }
            //TODO: 可以查询缓存用 securityTokenCacheItem.SecurityToken 与 user.SecurityStamp 作对比
            var user = await UserManager.GetByIdAsync(CurrentUser.GetId());

            // 更换手机号
            (await UserManager.ChangePhoneNumberAsync(user, input.NewPhoneNumber, input.Code)).CheckErrors();

            await CurrentUnitOfWork.SaveChangesAsync();

            var securityTokenCacheKey = SmsSecurityTokenCacheItem.CalculateCacheKey(input.NewPhoneNumber, "SmsChangePhoneNumber");
            await SecurityTokenCache.RemoveAsync(securityTokenCacheKey);
        }
        public PassiveRepositorySessionSecurityTokenCache(
            ITokenCacheRepository tokenCacheRepository,
            SecurityTokenCache inner)
        {
            if (tokenCacheRepository == null)
            {
                throw new ArgumentNullException("tokenCacheRepository");
            }
            if (inner == null)
            {
                throw new ArgumentNullException("inner");
            }

            this.tokenCacheRepository = tokenCacheRepository;
            this.inner = inner;

            serializer = new SessionSecurityTokenCookieSerializer();
        }
 public MachineKeySessionSecurityTokenHandler(SecurityTokenCache cache, TimeSpan tokenLifetime)
     : base(CreateTransforms(), cache, tokenLifetime)
 { }
 public MachineKeySessionSecurityTokenHandler(SecurityTokenCache cache, TimeSpan tokenLifetime)
     : base(CreateTransforms(), cache, tokenLifetime)
 {
 }
Example #9
0
 public LoginController()
 {
     _loadedEvent = new EventWaitHandle(false, EventResetMode.AutoReset);
     _tokenCache  = new SecurityTokenCache();
 }
Example #10
0
        private void StartShell()
        {
            AppDomain domain   = null;
            IntPtr    password = default(IntPtr);
            bool      logout   = false;

            try
            {
                AppDomainSetup setup = new AppDomainSetup();
                setup.ConfigurationFile = UserSessionService.ConfigFilename;
                setup.ApplicationBase   = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
                string assemblyName     = "Imi.SupplyChain.UX.Shell";
                string instanceTypeName = "Imi.SupplyChain.UX.Shell.ShellApplication";
                domain = AppDomain.CreateDomain("login", null, setup, new PermissionSet(PermissionState.Unrestricted));
                string securityTokenXml = null;

                if (_tokenCache.RawToken != null)
                {
                    securityTokenXml = SecurityTokenCache.Serialize(_tokenCache);
                }

                if (UserSessionService.Password != null)
                {
                    password = SecureStringHelper.GetString(UserSessionService.Password);
                    UserSessionService.Password = null;
                }

                object[] args = new object[4]
                {
                    password,
                    UserSessionService,
                    _loadedEvent,
                    securityTokenXml
                };

                CleanTempFiles();

                ThreadPool.QueueUserWorkItem(WaitForShellStartCallback);

                domain.CreateInstance(assemblyName, instanceTypeName, true, BindingFlags.CreateInstance, null, args, null, null);

                password = default(IntPtr);

                logout = domain.GetData("Logout") != null;
            }
            catch (ThreadAbortException)
            {
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry(StringResources.Title, ex.ToString(), EventLogEntryType.Error);
                throw;
            }
            finally
            {
                if (password != default(IntPtr))
                {
                    SecureStringHelper.FreeString(password);
                }

                if (domain != null)
                {
                    try
                    {
                        AppDomain.Unload(domain);
                    }
                    catch (CannotUnloadAppDomainException)
                    {
                    }
                    finally
                    {
                        domain = null;
                    }
                }

                try
                {
                    File.Delete(UserSessionService.ConfigFilename);
                }
                catch (Exception)
                {
                }

                CleanTempFiles();

                if (logout)
                {
                    _loginWindow.Dispatcher.Invoke(new Action(() =>
                    {
                        ShowLogin(true);
                        _loginWindow.Show();
                    }));
                }
                else
                {
                    _loginWindow.Closing -= LoginWindowClosingEventHandler;

                    _loginWindow.Dispatcher.Invoke(new Action(() =>
                    {
                        _loginWindow.Close();
                    }));
                }
            }
        }