//-----------------------------------------------------------------------
//
// Copyright (c) Andrew Arnott. All rights reserved.
//
//-----------------------------------------------------------------------
namespace DotNetOpenAuth.OpenId.Interop {
using System;
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.Contracts;
using System.Runtime.InteropServices;
using System.Web;
using DotNetOpenAuth.Messaging;
using DotNetOpenAuth.OpenId.Extensions.SimpleRegistration;
using DotNetOpenAuth.OpenId.RelyingParty;
///
/// The COM type used to provide details of an authentication result to a relying party COM client.
///
[SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Justification = "It's only creatable on the inside. It must be ComVisible for ASP to see it.")]
[ComVisible(true), Obsolete("This class acts as a COM Server and should not be called directly from .NET code.")]
public sealed class AuthenticationResponseShim {
///
/// The response read in by the Relying Party.
///
private readonly IAuthenticationResponse response;
///
/// Initializes a new instance of the class.
///
/// The response.
internal AuthenticationResponseShim(IAuthenticationResponse response) {
Contract.Requires(response != null);
this.response = response;
var claimsResponse = this.response.GetExtension();
if (claimsResponse != null) {
this.ClaimsResponse = new ClaimsResponseShim(claimsResponse);
}
}
///
/// Gets an Identifier that the end user claims to own. For use with user database storage and lookup.
/// May be null for some failed authentications (i.e. failed directed identity authentications).
///
///
///
/// This is the secure identifier that should be used for database storage and lookup.
/// It is not always friendly (i.e. =Arnott becomes =!9B72.7DD1.50A9.5CCD), but it protects
/// user identities against spoofing and other attacks.
///
///
/// For user-friendly identifiers to display, use the
/// property.
///
///
public string ClaimedIdentifier {
get { return this.response.ClaimedIdentifier; }
}
///
/// Gets a user-friendly OpenID Identifier for display purposes ONLY.
///
///
///
/// This should be put through before
/// sending to a browser to secure against javascript injection attacks.
///
///
/// This property retains some aspects of the user-supplied identifier that get lost
/// in the . For example, XRIs used as user-supplied
/// identifiers (i.e. =Arnott) become unfriendly unique strings (i.e. =!9B72.7DD1.50A9.5CCD).
/// For display purposes, such as text on a web page that says "You're logged in as ...",
/// this property serves to provide the =Arnott string, or whatever else is the most friendly
/// string close to what the user originally typed in.
///
///
/// If the user-supplied identifier is a URI, this property will be the URI after all
/// redirects, and with the protocol and fragment trimmed off.
/// If the user-supplied identifier is an XRI, this property will be the original XRI.
/// If the user-supplied identifier is an OpenID Provider identifier (i.e. yahoo.com),
/// this property will be the Claimed Identifier, with the protocol stripped if it is a URI.
///
///
/// It is very important that this property never be used for database storage
/// or lookup to avoid identity spoofing and other security risks. For database storage
/// and lookup please use the property.
///
///
public string FriendlyIdentifierForDisplay {
get { return this.response.FriendlyIdentifierForDisplay; }
}
///
/// Gets the provider endpoint that sent the assertion.
///
public string ProviderEndpoint {
get { return this.response.Provider != null ? this.response.Provider.Uri.AbsoluteUri : null; }
}
///
/// Gets a value indicating whether the authentication attempt succeeded.
///
public bool Successful {
get { return this.response.Status == AuthenticationStatus.Authenticated; }
}
///
/// Gets the Simple Registration response.
///
public ClaimsResponseShim ClaimsResponse { get; private set; }
///
/// Gets details regarding a failed authentication attempt, if available.
///
public string ExceptionMessage {
get { return this.response.Exception != null ? this.response.Exception.Message : null; }
}
}
}