static void Main(string[] args) { IRepositoryFactory repositoryFactory = RepositoryFactory.Instance; ISymmetricAlgorithmProvider symmetricAlgorithmProvider = SymmetricAlgorithmProvider.Instance; using (var traceManager = new TraceManager("trace.txt")) { using (var dbContext = new KerberosStorageContext()) { using (var unitOfWork = new UnitOfWork(dbContext, repositoryFactory)) { var users = unitOfWork.Repository<User, int>() .Query() .Filter(p => p.Email.Equals("*****@*****.**", StringComparison.OrdinalIgnoreCase)) .Get(); var user = users.FirstOrDefault(); if (user != null) { IAuthenticationService authenticationService = new AuthenticationService( unitOfWork, symmetricAlgorithmProvider, traceManager); var authenticationRequest = new AuthenticationRequest { ServerId = "authentication server", TimeStamp = DateTime.Now, UserId = user.Email }; traceManager.Trace("Authentication Request Sent", authenticationRequest); IAuthenticationReply authenticationReply = authenticationService.Authenticate(authenticationRequest); traceManager.Trace("TGS encrypted received", Tuple.Create(authenticationReply.TgsBytes, authenticationReply.TgtBytes)); ITgsToken tgsToken = authenticationService.DecryptReply(user.Email, authenticationReply); traceManager.Trace("TGS decrypted: ", tgsToken); IAuthorizationService authorizationService = new AuthorizationService( unitOfWork, symmetricAlgorithmProvider, traceManager); byte[] authenticator = authorizationService.CreateAuthenticator(user.Email, tgsToken.SessionKey); traceManager.Trace("Auth authenticator encrypted", authenticator); var authorizationRequest = new AuthorizationRequest { AutheticatorBytes = authenticator, TgtBytes = authenticationReply.TgtBytes }; IAuthorizationReply authorizationReply = authorizationService.Authorize(authorizationRequest); traceManager.Trace("Authorization reply received", Tuple.Create(authorizationReply.ServiceTicket, authorizationReply.ServiceToken)); IServiceToken serviceToken = authorizationService.DecryptReply(user.Email, authorizationReply, tgsToken.SessionKey); traceManager.Trace("Service token decrypted", serviceToken); IDataService dataService = new DataService(unitOfWork, symmetricAlgorithmProvider, traceManager); authenticator = dataService.CreateAuthenticator(user.Email, serviceToken.SessionKey); var dataServiceRequest = new DataServiceRequest { Authenticator = authenticator, ServiceTicket = authorizationReply.ServiceTicket }; traceManager.Trace("Data service request sent", dataServiceRequest); IDataServiceReply dataServiceReply = dataService.GetAccess(dataServiceRequest); ITimeStampContainer timeStampContainer = dataService.DecryptReply(user.Email, dataServiceReply, serviceToken.SessionKey); if (Math.Abs((DateTime.UtcNow - new DateTime(timeStampContainer.TimeStamp, DateTimeKind.Utc)).Ticks) < new TimeSpan(1, 0, 0).Ticks) { traceManager.Trace("The operation has been completed successfully."); } } } } } }