internal static void RenewIfExpired(NSMessageHandler nsMessageHandler, SSOTicketType renew) { CheckCleanup(); if (nsMessageHandler == null || nsMessageHandler.Credentials == null) { return; } string authUser = nsMessageHandler.Credentials.Account; string authPassword = nsMessageHandler.Credentials.Password; if (String.IsNullOrEmpty(authUser) || String.IsNullOrEmpty(authPassword)) { return; } string sha256key = MSNTicket.ComputeSHA(authUser, authPassword); MSNTicket ticket = GetFromCacheOrCreateNewWithLock(sha256key, nsMessageHandler.Credentials); ExpiryState es = ticket.Expired(renew); if (es == ExpiryState.NotExpired) { nsMessageHandler.MSNTicket = ticket; } else if (es == ExpiryState.Expired || es == ExpiryState.WillExpireSoon) { Trace.WriteLineIf(Settings.TraceSwitch.TraceInfo, "Re-new ticket: " + renew, "SingleSignOnManager"); SingleSignOn sso = new SingleSignOn(nsMessageHandler, ticket.Policy); sso.AddAuths(renew); if (es == ExpiryState.WillExpireSoon) { nsMessageHandler.MSNTicket = ticket; // The ticket is in cache but it will expire soon. // Do ASYNC call. sso.Authenticate(ticket, delegate(object sender, EventArgs e) { AddToCacheWithLock(ticket); }, delegate(object sender, ExceptionEventArgs e) { DeleteFromCacheWithLock(sha256key); } ); } else { // The ticket expired but we need this ticket absolutely. // Do SYNC call. AuthenticateRetryAndUpdateCacheSync(sso, ticket, sha256key, 3); nsMessageHandler.MSNTicket = ticket; } } }
public ExpiryState Expired(SSOTicketType tt) { if (SSOTickets.ContainsKey(tt)) { if (SSOTickets[tt].Expires < DateTime.Now) { return(ExpiryState.Expired); } return((SSOTickets[tt].Expires < DateTime.Now.AddSeconds(30)) ? ExpiryState.WillExpireSoon : ExpiryState.NotExpired); } return(ExpiryState.Expired); }
public void AddAuths(SSOTicketType ssott) { AuthenticationAdd("http://Passport.NET/tb", null); SSOTicketType[] ssos = (SSOTicketType[])Enum.GetValues(typeof(SSOTicketType)); foreach (SSOTicketType sso in ssos) { switch (sso & ssott) { case SSOTicketType.Contact: AuthenticationAdd("contacts.msn.com", "MBI"); break; case SSOTicketType.Clear: AuthenticationAdd("messengerclear.live.com", policy); break; case SSOTicketType.Storage: AuthenticationAdd("storage.msn.com", "MBI"); break; case SSOTicketType.WhatsUp: AuthenticationAdd("sup.live.com", "MBI"); break; case SSOTicketType.Directory: AuthenticationAdd("directory.services.live.com", "MBI"); break; case SSOTicketType.RPST: AuthenticationAdd("rpstauth.live.com", "MBI"); break; } } }
internal static void Authenticate( NSMessageHandler nsMessageHandler, string policy, EventHandler onSuccess, EventHandler <ExceptionEventArgs> onError) { CheckCleanup(); if (nsMessageHandler == null || nsMessageHandler.Credentials == null) { return; } string authUser = nsMessageHandler.Credentials.Account; string authPassword = nsMessageHandler.Credentials.Password; if (String.IsNullOrEmpty(authUser) || String.IsNullOrEmpty(authPassword)) { return; } string sha256key = MSNTicket.ComputeSHA(authUser, authPassword); MSNTicket ticket = GetFromCacheOrCreateNewWithLock(sha256key, nsMessageHandler.Credentials); SSOTicketType[] ssos = (SSOTicketType[])Enum.GetValues(typeof(SSOTicketType)); SSOTicketType expiredtickets = SSOTicketType.None; foreach (SSOTicketType ssot in ssos) { if (ExpiryState.NotExpired != ticket.Expired(ssot)) { expiredtickets |= ssot; } } if (expiredtickets == SSOTicketType.None) { nsMessageHandler.MSNTicket = ticket; if (onSuccess != null) { onSuccess(nsMessageHandler, EventArgs.Empty); } } else { Trace.WriteLineIf(Settings.TraceSwitch.TraceInfo, "Request new tickets: " + expiredtickets, "SingleSignOnManager"); SingleSignOn sso = new SingleSignOn(nsMessageHandler, policy); sso.AddAuths(expiredtickets); // ASYNC if (onSuccess != null && onError != null) { try { sso.Authenticate(ticket, delegate(object sender, EventArgs e) { try { AddToCacheWithLock(ticket); // Check Credentials again. Owner may sign off while SSOing. if (nsMessageHandler.Credentials != null && nsMessageHandler.Credentials.Account == authUser && nsMessageHandler.Credentials.Password == authPassword && nsMessageHandler.IsSignedIn == false) { NSMessageProcessor nsmp = nsMessageHandler.MessageProcessor as NSMessageProcessor; if (nsmp != null && nsmp.Connected) { nsMessageHandler.MSNTicket = ticket; onSuccess(nsMessageHandler, e); } } } catch (Exception ex) { DeleteFromCacheWithLock(sha256key); onError(nsMessageHandler, new ExceptionEventArgs(ex)); } }, delegate(object sender, ExceptionEventArgs e) { DeleteFromCacheWithLock(sha256key); onError(nsMessageHandler, e); }); } catch (Exception error) { DeleteFromCacheWithLock(sha256key); onError(nsMessageHandler, new ExceptionEventArgs(error)); } } else { // SYNC AuthenticateRetryAndUpdateCacheSync(sso, ticket, sha256key, 3); nsMessageHandler.MSNTicket = ticket; } } }
public SSOTicket(SSOTicketType tickettype) { type = tickettype; }
private void GetTickets(RequestSecurityTokenResponseType[] result, SecurityTokenService securService, MSNTicket msnticket) { if (securService.pp != null) { if (securService.pp.credProperties != null) { foreach (credPropertyType credproperty in securService.pp.credProperties) { if (credproperty.Name == "MainBrandID") { msnticket.MainBrandID = credproperty.Value; } if (credproperty.Name == "CID" && !String.IsNullOrEmpty(credproperty.Value)) { msnticket.OwnerCID = long.Parse(credproperty.Value, NumberStyles.HexNumber); } } } if (securService.pp.extProperties != null) { foreach (extPropertyType extproperty in securService.pp.extProperties) { if (extproperty.Name == "CID" && !String.IsNullOrEmpty(extproperty.Value)) { msnticket.OwnerCID = long.Parse(extproperty.Value, NumberStyles.HexNumber); } } } } foreach (RequestSecurityTokenResponseType token in result) { SSOTicketType ticketype = SSOTicketType.None; switch (token.AppliesTo.EndpointReference.Address.Value) { case "contacts.msn.com": ticketype = SSOTicketType.Contact; break; case "messengerclear.live.com": ticketype = SSOTicketType.Clear; break; case "storage.msn.com": ticketype = SSOTicketType.Storage; break; case "sup.live.com": ticketype = SSOTicketType.WhatsUp; break; case "directory.services.live.com": ticketype = SSOTicketType.Directory; break; case "rpstauth.live.com": ticketype = SSOTicketType.RPST; break; } SSOTicket ssoticket = new SSOTicket(ticketype); if (token.AppliesTo != null) { ssoticket.Domain = token.AppliesTo.EndpointReference.Address.Value; } if (token.RequestedSecurityToken.BinarySecurityToken != null) { ssoticket.Ticket = token.RequestedSecurityToken.BinarySecurityToken.Value; } if (token.RequestedProofToken != null && token.RequestedProofToken.BinarySecret != null) { ssoticket.BinarySecret = token.RequestedProofToken.BinarySecret.Value; } if (token.Lifetime != null) { ssoticket.Created = XmlConvert.ToDateTime(token.Lifetime.Created.Value, "yyyy-MM-ddTHH:mm:ssZ"); ssoticket.Expires = XmlConvert.ToDateTime(token.Lifetime.Expires.Value, "yyyy-MM-ddTHH:mm:ssZ"); } lock (msnticket.SSOTickets) { msnticket.SSOTickets[ticketype] = ssoticket; } } }
public ExpiryState Expired(SSOTicketType tt) { if (SSOTickets.ContainsKey(tt)) { if (SSOTickets[tt].Expires < DateTime.Now) return ExpiryState.Expired; return (SSOTickets[tt].Expires < DateTime.Now.AddSeconds(30)) ? ExpiryState.WillExpireSoon : ExpiryState.NotExpired; } return ExpiryState.Expired; }
internal static void RenewIfExpired(NSMessageHandler nsMessageHandler, SSOTicketType renew) { CheckCleanup(); if (nsMessageHandler == null || nsMessageHandler.Credentials == null) return; string authUser = nsMessageHandler.Credentials.Account; string authPassword = nsMessageHandler.Credentials.Password; if (String.IsNullOrEmpty(authUser) || String.IsNullOrEmpty(authPassword)) return; string sha256key = MSNTicket.ComputeSHA(authUser, authPassword); MSNTicket ticket = GetFromCacheOrCreateNewWithLock(sha256key, nsMessageHandler.Credentials); ExpiryState es = ticket.Expired(renew); if (es == ExpiryState.NotExpired) { nsMessageHandler.MSNTicket = ticket; } else if (es == ExpiryState.Expired || es == ExpiryState.WillExpireSoon) { Trace.WriteLineIf(Settings.TraceSwitch.TraceInfo, "Re-new ticket: " + renew, "SingleSignOnManager"); SingleSignOn sso = new SingleSignOn(nsMessageHandler, ticket.Policy); sso.AddAuths(renew); if (es == ExpiryState.WillExpireSoon) { nsMessageHandler.MSNTicket = ticket; // The ticket is in cache but it will expire soon. // Do ASYNC call. sso.Authenticate(ticket, delegate(object sender, EventArgs e) { AddToCacheWithLock(ticket); }, delegate(object sender, ExceptionEventArgs e) { DeleteFromCacheWithLock(sha256key); } ); } else { // The ticket expired but we need this ticket absolutely. // Do SYNC call. AuthenticateRetryAndUpdateCacheSync(sso, ticket, sha256key, 3); nsMessageHandler.MSNTicket = ticket; } } }