class DigestSession
{
static RandomNumberGenerator rng;
+ DateTime lastUse;
static DigestSession ()
{
public DigestSession ()
{
_nc = 1;
+ lastUse = DateTime.Now;
}
public string Algorithm {
if (request == null)
return null;
+ lastUse = DateTime.Now;
NetworkCredential cred = credentials.GetCredential (request.RequestUri, "digest");
string userName = cred.UserName;
if (userName == null || userName == "")
auth.Length -= 2; // remove ", "
return new Authorization (auth.ToString ());
}
+
+ public DateTime LastUse {
+ get { return lastUse; }
+ }
}
class DigestClient : IAuthenticationModule
{
- static Hashtable cache; // cache entries by nonce
+ static Hashtable cache;
+
+ public DigestClient () {}
+
+ static Hashtable Cache {
+ get {
+ lock (typeof (DigestClient)) {
+ if (cache == null) {
+ cache = Hashtable.Synchronized (new Hashtable ());
+ } else {
+ CheckExpired (cache.Count);
+ }
- static DigestClient ()
+ return cache;
+ }
+ }
+ }
+
+ static void CheckExpired (int count)
{
- cache = Hashtable.Synchronized (new Hashtable ());
+ if (count < 10)
+ return;
+
+ DateTime t = DateTime.MaxValue;
+ DateTime now = DateTime.Now;
+ ArrayList list = null;
+ foreach (int key in cache.Keys) {
+ DigestSession elem = (DigestSession) cache [key];
+ if (elem.LastUse < t &&
+ (elem.LastUse - now).Ticks > TimeSpan.TicksPerMinute * 10) {
+ t = elem.LastUse;
+ if (list == null)
+ list = new ArrayList ();
+
+ list.Add (key);
+ }
+ }
+
+ if (list != null) {
+ foreach (int k in list)
+ cache.Remove (k);
+ }
}
-
- public DigestClient () {}
-
+
// IAuthenticationModule
public Authorization Authenticate (string challenge, WebRequest webRequest, ICredentials credentials)
if (request == null)
return null;
- DigestSession ds = (DigestSession) cache [request.Address];
+ int hashcode = request.Address.GetHashCode () ^ credentials.GetHashCode ();
+ DigestSession ds = (DigestSession) Cache [hashcode];
bool addDS = (ds == null);
if (addDS)
ds = new DigestSession ();
return null;
if (addDS)
- cache.Add (request.Address, ds);
+ Cache.Add (hashcode, ds);
return ds.Authenticate (webRequest, credentials);
}
if (request == null)
return null;
- // check cache for URI
- DigestSession ds = (DigestSession) cache [request.Address];
+ if (credentials == null)
+ return null;
+
+ int hashcode = request.Address.GetHashCode () ^ credentials.GetHashCode ();
+ DigestSession ds = (DigestSession) Cache [hashcode];
if (ds == null)
return null;