//-----------------------------------------------------------------------
//
// Copyright (c) Outercurve Foundation. All rights reserved.
//
//-----------------------------------------------------------------------
namespace DotNetOpenAuth.ApplicationBlock {
using System;
using System.Collections.Generic;
using System.Diagnostics;
using DotNetOpenAuth.OAuth;
using DotNetOpenAuth.OAuth.ChannelElements;
using DotNetOpenAuth.OAuth.Messages;
using DotNetOpenAuth.OpenId.Extensions.OAuth;
///
/// A token manager that only retains tokens in memory.
/// Meant for SHORT TERM USE TOKENS ONLY.
///
///
/// A likely application of this class is for "Sign In With Twitter",
/// where the user only signs in without providing any authorization to access
/// Twitter APIs except to authenticate, since that access token is only useful once.
///
public class InMemoryTokenManager : IConsumerTokenManager, IOpenIdOAuthTokenManager {
private Dictionary tokensAndSecrets = new Dictionary();
///
/// Initializes a new instance of the class.
///
/// The consumer key.
/// The consumer secret.
public InMemoryTokenManager(string consumerKey, string consumerSecret) {
if (string.IsNullOrEmpty(consumerKey)) {
throw new ArgumentNullException("consumerKey");
}
this.ConsumerKey = consumerKey;
this.ConsumerSecret = consumerSecret;
}
///
/// Gets the consumer key.
///
/// The consumer key.
public string ConsumerKey { get; private set; }
///
/// Gets the consumer secret.
///
/// The consumer secret.
public string ConsumerSecret { get; private set; }
#region ITokenManager Members
///
/// Gets the Token Secret given a request or access token.
///
/// The request or access token.
///
/// The secret associated with the given token.
///
/// Thrown if the secret cannot be found for the given token.
public string GetTokenSecret(string token) {
return this.tokensAndSecrets[token];
}
///
/// Stores a newly generated unauthorized request token, secret, and optional
/// application-specific parameters for later recall.
///
/// The request message that resulted in the generation of a new unauthorized request token.
/// The response message that includes the unauthorized request token.
/// Thrown if the consumer key is not registered, or a required parameter was not found in the parameters collection.
///
/// Request tokens stored by this method SHOULD NOT associate any user account with this token.
/// It usually opens up security holes in your application to do so. Instead, you associate a user
/// account with access tokens (not request tokens) in the
/// method.
///
public void StoreNewRequestToken(UnauthorizedTokenRequest request, ITokenSecretContainingMessage response) {
this.tokensAndSecrets[response.Token] = response.TokenSecret;
}
///
/// Deletes a request token and its associated secret and stores a new access token and secret.
///
/// The Consumer that is exchanging its request token for an access token.
/// The Consumer's request token that should be deleted/expired.
/// The new access token that is being issued to the Consumer.
/// The secret associated with the newly issued access token.
///
///
/// Any scope of granted privileges associated with the request token from the
/// original call to should be carried over
/// to the new Access Token.
///
///
/// To associate a user account with the new access token,
/// HttpContext.Current.User may be
/// useful in an ASP.NET web application within the implementation of this method.
/// Alternatively you may store the access token here without associating with a user account,
/// and wait until or
/// return the access
/// token to associate the access token with a user account at that point.
///
///
public void ExpireRequestTokenAndStoreNewAccessToken(string consumerKey, string requestToken, string accessToken, string accessTokenSecret) {
this.tokensAndSecrets.Remove(requestToken);
this.tokensAndSecrets[accessToken] = accessTokenSecret;
}
///
/// Classifies a token as a request token or an access token.
///
/// The token to classify.
/// Request or Access token, or invalid if the token is not recognized.
public TokenType GetTokenType(string token) {
throw new NotImplementedException();
}
#endregion
#region IOpenIdOAuthTokenManager Members
///
/// Stores a new request token obtained over an OpenID request.
///
/// The consumer key.
/// The authorization message carrying the request token and authorized access scope.
///
/// The token secret is the empty string.
/// Tokens stored by this method should be short-lived to mitigate
/// possible security threats. Their lifetime should be sufficient for the
/// relying party to receive the positive authentication assertion and immediately
/// send a follow-up request for the access token.
///
public void StoreOpenIdAuthorizedRequestToken(string consumerKey, AuthorizationApprovedResponse authorization) {
this.tokensAndSecrets[authorization.RequestToken] = string.Empty;
}
#endregion
}
}