Interface used for Association persistence management objects.
| C# | Visual Basic | Visual C++ |
public interface IAssociationPersistence
Public Interface IAssociationPersistence
public interface class IAssociationPersistence
| All Members | Methods | ||||
| Icon | Member | Description |
|---|---|---|
| Add(Association) |
Adds an assocation entry to persistence.
| |
| Cleanup()()() |
Remove expired association entries from persistence.
| |
| FindByHandle(String) |
Retrieve an association entry by its handle.
| |
| FindByServer(String) |
Retrieve an association entry by the OpenID Provider Server URL
| |
| Remove(Association) |
Removes an association entry from persistence.
|
public sealed class ApplicationAssociationManager : IAssociationPersistence { const string nextAssocCleanup = "OpenID_NextAssocCleanup"; const string associations = "OpenID_Associations"; private DateTime NextCleanup { get { if (HttpContext.Current.Application[nextAssocCleanup] == null) { return DateTime.MaxValue; } return (DateTime)HttpContext.Current.Application[nextAssocCleanup]; } set { HttpContext.Current.Application[nextAssocCleanup] = value; } } private DataTable Associations { get { if (HttpContext.Current.Application[associations] == null) { Init(); } return (DataTable)HttpContext.Current.Application[associations]; } set { if (HttpContext.Current.Application[associations] == null) { Init(); } HttpContext.Current.Application[associations] = value; } } public void Init() { DataTable dt = new DataTable(); dt.Columns.Add("protocol", typeof(ProtocolVersion)); dt.Columns.Add("server", typeof(string)); dt.Columns.Add("handle", typeof(string)); dt.Columns.Add("assoc_type", typeof(string)); dt.Columns.Add("session_type", typeof(string)); dt.Columns.Add("secret", typeof(byte[])); dt.Columns.Add("expiration", typeof(DateTime)); dt.AcceptChanges(); HttpContext.Current.Application[associations] = dt; } public void Remove(Association assoc) { DataRow[] rows = Associations.Select("handle = '" + assoc.Handle + "'"); foreach (DataRow dr in rows) { Associations.Rows.Remove(dr); } Associations.AcceptChanges(); } public void Add(Association association) { // Check for existing association DataRow[] result = Associations.Select("server = '" + association.Server + "'"); if (result.Length > 0) { for (int i = 0; i < result.Length; i++) { Associations.Rows.Remove(result[i]); } } // Add new row DataRow dr = Associations.NewRow(); dr["protocol"] = association.ProtocolVersion; dr["server"] = association.Server; dr["handle"] = association.Handle; dr["assoc_type"] = association.AssociationType; dr["session_type"] = association.SessionType; dr["secret"] = association.Secret; dr["expiration"] = association.Expiration; Associations.Rows.Add(dr); Associations.AcceptChanges(); } private Association ToAssociation(DataRow dr) { Association ar = new Association(); ar.ProtocolVersion = (ProtocolVersion)dr["protocol"]; ar.Server = (string)dr["server"]; ar.Handle = (string)dr["handle"]; ar.AssociationType = (string)dr["assoc_type"]; ar.SessionType = (string)dr["session_type"]; ar.Secret = (byte[])dr["secret"]; ar.Expiration = (DateTime)dr["expiration"]; return ar; } public Association FindByHandle(string handle) { DataRow[] result = Associations.Select("handle = '" + handle + "'"); if (result.Length > 0) { return ToAssociation(result[0]); } return null; } public Association FindByServer(string server) { DataRow[] result = Associations.Select("server = '" + server + "'"); if (result.Length > 0) { return ToAssociation(result[0]); } return null; } public void Cleanup() { if (NextCleanup == null || NextCleanup < DateTime.UtcNow) { foreach (DataRow dr in Associations.Rows) { if ((DateTime)dr["expiration"] < DateTime.UtcNow) { dr.Delete(); } } Associations.AcceptChanges(); NextCleanup = DateTime.UtcNow.AddMinutes(10); } } }