//-----------------------------------------------------------------------
//
// Copyright (c) Andrew Arnott. All rights reserved.
//
//-----------------------------------------------------------------------
namespace RelyingPartyLogic {
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DotNetOpenAuth.OAuth.ChannelElements;
public class OAuthServiceProviderTokenManager : OAuthTokenManager, IServiceProviderTokenManager {
///
/// Initializes a new instance of the class.
///
public OAuthServiceProviderTokenManager() {
}
#region IServiceProviderTokenManager Members
///
/// Gets the Consumer description for a given a Consumer Key.
///
/// The Consumer Key.
///
/// A description of the consumer. Never null.
///
/// Thrown if the consumer key cannot be found.
public IConsumerDescription GetConsumer(string consumerKey) {
try {
return Database.DataContext.Consumers.First(c => c.ConsumerKey == consumerKey);
} catch (InvalidOperationException) {
throw new KeyNotFoundException();
}
}
///
/// Checks whether a given request token has already been authorized
/// by some user for use by the Consumer that requested it.
///
/// The Consumer's request token.
///
/// True if the request token has already been fully authorized by the user
/// who owns the relevant protected resources. False if the token has not yet
/// been authorized, has expired or does not exist.
///
public bool IsRequestTokenAuthorized(string requestToken) {
return Database.DataContext.IssuedTokens.OfType().Any(
t => t.Token == requestToken && t.User != null);
}
///
/// Gets details on the named request token.
///
/// The request token.
/// A description of the token. Never null.
/// Thrown if the token cannot be found.
///
/// It is acceptable for implementations to find the token, see that it has expired,
/// delete it from the database and then throw ,
/// or alternatively it can return the expired token anyway and the OAuth channel will
/// log and throw the appropriate error.
///
public IServiceProviderRequestToken GetRequestToken(string token) {
try {
return Database.DataContext.IssuedTokens.OfType().First(tok => tok.Token == token);
} catch (InvalidOperationException) {
throw new KeyNotFoundException();
}
}
///
/// Gets details on the named access token.
///
/// The access token.
/// A description of the token. Never null.
/// Thrown if the token cannot be found.
///
/// It is acceptable for implementations to find the token, see that it has expired,
/// delete it from the database and then throw ,
/// or alternatively it can return the expired token anyway and the OAuth channel will
/// log and throw the appropriate error.
///
public IServiceProviderAccessToken GetAccessToken(string token) {
try {
return Database.DataContext.IssuedTokens.OfType().First(tok => tok.Token == token);
} catch (InvalidOperationException) {
throw new KeyNotFoundException();
}
}
///
/// Persists any changes made to the token.
///
/// The token whose properties have been changed.
///
/// This library will invoke this method after making a set
/// of changes to the token as part of a web request to give the host
/// the opportunity to persist those changes to a database.
/// Depending on the object persistence framework the host site uses,
/// this method MAY not need to do anything (if changes made to the token
/// will automatically be saved without any extra handling).
///
public void UpdateToken(IServiceProviderRequestToken token) {
Database.DataContext.SaveChanges();
}
#endregion
}
}