diff options
author | Andrew Arnott <andrewarnott@gmail.com> | 2009-05-31 22:49:16 -0700 |
---|---|---|
committer | Andrew Arnott <andrewarnott@gmail.com> | 2009-05-31 22:49:16 -0700 |
commit | 8b55ee651212f5558e57ff502bb2b1eda3748dbf (patch) | |
tree | a0cb30edbe135bd1ce91ca498723d523078d3784 /samples/DotNetOpenAuth.ApplicationBlock/Provider/AnonymousIdentifierProviderBase.cs | |
parent | e7cb9e9c127da70ec1a54969ae7770c1b7ce43c3 (diff) | |
download | DotNetOpenAuth-8b55ee651212f5558e57ff502bb2b1eda3748dbf.zip DotNetOpenAuth-8b55ee651212f5558e57ff502bb2b1eda3748dbf.tar.gz DotNetOpenAuth-8b55ee651212f5558e57ff502bb2b1eda3748dbf.tar.bz2 |
Promoted PPID identifier provider from the application block to the core library.
Diffstat (limited to 'samples/DotNetOpenAuth.ApplicationBlock/Provider/AnonymousIdentifierProviderBase.cs')
-rw-r--r-- | samples/DotNetOpenAuth.ApplicationBlock/Provider/AnonymousIdentifierProviderBase.cs | 122 |
1 files changed, 0 insertions, 122 deletions
diff --git a/samples/DotNetOpenAuth.ApplicationBlock/Provider/AnonymousIdentifierProviderBase.cs b/samples/DotNetOpenAuth.ApplicationBlock/Provider/AnonymousIdentifierProviderBase.cs deleted file mode 100644 index 1df7267..0000000 --- a/samples/DotNetOpenAuth.ApplicationBlock/Provider/AnonymousIdentifierProviderBase.cs +++ /dev/null @@ -1,122 +0,0 @@ -//----------------------------------------------------------------------- -// <copyright file="AnonymousIdentifierProviderBase.cs" company="Andrew Arnott"> -// Copyright (c) Andrew Arnott. All rights reserved. -// </copyright> -//----------------------------------------------------------------------- - -namespace DotNetOpenAuth.ApplicationBlock.Provider { - using System; - using System.Collections.Generic; - using System.Diagnostics.CodeAnalysis; - using System.Linq; - using System.Security.Cryptography; - using System.Text; - using DotNetOpenAuth.Messaging; - using DotNetOpenAuth.OpenId; - - public abstract class AnonymousIdentifierProviderBase { - private int newSaltLength = 20; - - /// <summary> - /// Initializes a new instance of the <see cref="AnonymousIdentifierProviderBase"/> class. - /// </summary> - /// <param name="baseIdentifier">The base URI on which to append the anonymous part.</param> - public AnonymousIdentifierProviderBase(Uri baseIdentifier) { - if (baseIdentifier == null) { - throw new ArgumentNullException("baseIdentifier"); - } - - this.Hasher = HashAlgorithm.Create("SHA256"); - this.Encoder = Encoding.UTF8; - this.BaseIdentifier = baseIdentifier; - } - - public Uri BaseIdentifier { get; private set; } - - protected HashAlgorithm Hasher { get; private set; } - - protected Encoding Encoder { get; private set; } - - protected int NewSaltLength { - get { - return this.newSaltLength; - } - - set { - if (value <= 0) { - throw new ArgumentOutOfRangeException("value"); - } - - this.newSaltLength = value; - } - } - - #region IAnonymousIdentifierProvider Members - - public Uri GetAnonymousIdentifier(Identifier localIdentifier, Realm relyingPartyRealm) { - byte[] salt = this.GetHashSaltForLocalIdentifier(localIdentifier); - string valueToHash = localIdentifier + "#" + (relyingPartyRealm ?? string.Empty); - byte[] valueAsBytes = this.Encoder.GetBytes(valueToHash); - byte[] bytesToHash = new byte[valueAsBytes.Length + salt.Length]; - valueAsBytes.CopyTo(bytesToHash, 0); - salt.CopyTo(bytesToHash, valueAsBytes.Length); - byte[] hash = this.Hasher.ComputeHash(bytesToHash); - string base64Hash = Convert.ToBase64String(hash); - Uri anonymousIdentifier = this.AppendIdentifiers(this.BaseIdentifier, base64Hash); - return anonymousIdentifier; - } - - #endregion - - protected virtual byte[] GetNewSalt() { - // We COULD use a crypto random function, but for a salt it seems overkill. - return Util.GetNonCryptoRandomData(this.NewSaltLength); - } - - protected Uri AppendIdentifiers(Uri baseIdentifier, string uriHash) { - if (baseIdentifier == null) { - throw new ArgumentNullException("baseIdentifier"); - } - if (String.IsNullOrEmpty(uriHash)) { - throw new ArgumentNullException("uriHash"); - } - - if (string.IsNullOrEmpty(baseIdentifier.Query)) { - // The uriHash will appear on the path itself. - string pathEncoded = Uri.EscapeUriString(uriHash.Replace('/', '_')); - return new Uri(baseIdentifier, pathEncoded); - } else { - // The uriHash will appear on the query string. - string dataEncoded = Uri.EscapeDataString(uriHash); - return new Uri(baseIdentifier + dataEncoded); - } - } - - /// <summary> - /// Gets the salt to use for generating an anonymous identifier for a given OP local identifier. - /// </summary> - /// <param name="localIdentifier">The OP local identifier.</param> - /// <returns>The salt to use in the hash.</returns> - /// <remarks> - /// It is important that this method always return the same value for a given - /// <paramref name="localIdentifier"/>. - /// New salts can be generated for local identifiers without previously assigned salt - /// values by calling <see cref="GetNewSalt"/> or by a custom method. - /// </remarks> - protected abstract byte[] GetHashSaltForLocalIdentifier(Identifier localIdentifier); - -#if CONTRACTS_FULL - /// <summary> - /// Verifies conditions that should be true for any valid state of this object. - /// </summary> - [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Justification = "Called by code contracts.")] - [ContractInvariantMethod] - protected void ObjectInvariant() { - Contract.Invariant(this.Hasher != null); - Contract.Invariant(this.Encoder != null); - Contract.Invariant(this.BaseIdentifier != null); - Contract.Invariant(this.NewHashLength > 0); - } -#endif - } -} |