public bool Authenticate(IUserCredential tool, string role) { if (IsStandAlone) { UserIdentity principal = new UserIdentity(UserInfo.Empty, true, new TimeSpan(0), "local"); AppDomain.CurrentDomain.SetThreadPrincipal(principal); _userCollection.Add(principal); } else { if (_loginServiceClient == null) { _callBack = new LoginServiceCallback(_userCollection); _loginServiceClient = new DuplexClient<ILoginService>(new InstanceContext(_callBack), _configuration.PingInterval); _loginServiceClient.Open(); _loginServiceClient.OnChanged += new EventHandler<ClientState>(_loginServiceClient_OnChanged); } string loginName, password; again: ; if (tool.GetUserCredential(out loginName, out password)) { byte[] hash = SecurityUtils.PasswordToHash(password); UserIdentity principal = loginService.Login(loginName, hash, Environment.MachineName); if (principal == null || !principal.IsAuthenticated) { tool.FailedLogin(); goto again; } if (role != null && !principal.IsInRole(role)) { tool.FailedRole(role); loginService.Logoff(principal); goto again; } AppDomain.CurrentDomain.SetThreadPrincipal(principal); loginService.Subscribe(principal); _userCollection.AddRange(loginService.GetUserLoginCollection()); } else { return false; //throw new ApplicationException("User cancel"); } } return true; }
public bool Authenticate(UserIdentity previousId) { if (_loginServiceClient == null) { _callBack = new LoginServiceCallback(_userCollection); _loginServiceClient = new DuplexClient<ILoginService>(new InstanceContext(_callBack), _configuration.PingInterval); _loginServiceClient.Open(); _loginServiceClient.OnChanged += new EventHandler<ClientState>(_loginServiceClient_OnChanged); } UserIdentity principal = loginService.Login(previousId.User.Name, previousId.User.Hash, Environment.MachineName); if (principal == null || !principal.IsAuthenticated) { return false; } AppDomain.CurrentDomain.SetThreadPrincipal(principal); loginService.Subscribe(principal); _userCollection.AddRange(loginService.GetUserLoginCollection()); return true; }