public override void RequestAuthentication(HttpContextBase context, Uri returnUrl)
{
var request = Guid.NewGuid();
var relyingPartyField = typeof(DotNetOpenAuth.AspNet.Clients.OpenIdClient).GetField("RelyingParty",
BindingFlags.Static | BindingFlags.NonPublic);
var providerIdentifierField = typeof(DotNetOpenAuth.AspNet.Clients.OpenIdClient).GetField(
"providerIdentifier", BindingFlags.NonPublic | BindingFlags.Instance);
var relyingParty = (OpenIdRelyingParty)relyingPartyField.GetValue(this);
var realm = new Realm(_realmUri ?? new Uri(returnUrl.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped)));
var userSuppliedIdentifier = new Uri((Identifier)providerIdentifierField.GetValue(this));
var localhost = new Uri(ConfigurationManager.AppSettings["CustomEndpointHost"] ?? "http://localhost/");
var userSuppliedIdentifierForRequestMachine = new Uri(localhost,
new Uri(userSuppliedIdentifier.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped)).MakeRelativeUri(userSuppliedIdentifier));
Logger.InfoFormat("Request {0}; userSuppliedIdentifier {1}; userSuppliedIdentifierForRequestMachine {2}", request, userSuppliedIdentifier, userSuppliedIdentifierForRequestMachine);
IAuthenticationRequest authenticationRequest = relyingParty.CreateRequest(userSuppliedIdentifierForRequestMachine, realm, returnUrl);
OnBeforeSendingAuthenticationRequest(authenticationRequest);
try
{
var property = authenticationRequest.DiscoveryResult.GetType().GetProperty("ProviderEndpoint");
var providerEndPointUri = (Uri)property.GetValue(authenticationRequest.DiscoveryResult, null);
var providerEndPointUriRequestMachine = new Uri(new Uri(context.Request.Url.GetComponents(UriComponents.SchemeAndServer,UriFormat.Unescaped)),
new Uri(providerEndPointUri.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped)).MakeRelativeUri(providerEndPointUri));
Logger.InfoFormat("Request {0}; userSupplied {1}", request, userSuppliedIdentifier);
property.SetValue(authenticationRequest.DiscoveryResult, providerEndPointUriRequestMachine, BindingFlags.SetProperty, null, null, CultureInfo.CurrentCulture);
authenticationRequest.RedirectToProvider();
}
catch (Exception ex)
{
Logger.Error("Error in discovery modification", ex);
throw;
}
}