OpenIdProvider.GetRequest () gibt null zurück

Als eine Art Fortsetzung vondiese frage, ich habe probleme mit dotnetopenauth.

Ich navigiere zu meinem Code der vertrauenden Partei und erstelle die Anfrage, jedoch, wenn mein Provider die Anfrage erhältOpenIdProvider.GetRequest() gibt null zurück. Ich habe den Code durchgesehen und soweit ich das beurteilen kann, ist dies darauf zurückzuführen, dass die OpenID-Nutzdaten (request.form) nicht von meiner vertrauenden Partei geliefert werden. aber ich kann nicht herausfinden, warum das so ist.

Code:

Vertrauende Partei:

public ActionResult Authenticate(string RuserName = "")
{
UriBuilder returnToBuilder = new UriBuilder(Request.Url);
returnToBuilder.Path = "/OpenId/Authenticate";
returnToBuilder.Query = null;
returnToBuilder.Fragment = null;

Uri returnTo = returnToBuilder.Uri;
returnToBuilder.Path = "/";
Realm realm = returnToBuilder.Uri;

var response = openid.GetResponse();

if (response == null) {
    if (Request.QueryString["ReturnUrl"] != null && User.Identity.IsAuthenticated) {

    } else {

    string strIdentifier = "http://localhost:3314/User/Identity/" + RuserName;
    var request = openid.CreateRequest(
        strIdentifier,
        realm,
        returnTo);

    var fetchRequest = new FetchRequest();
    request.AddExtension(fetchRequest);
    request.RedirectToProvider();
    }
} else {
    switch (response.Status) {
        case AuthenticationStatus.Canceled:
            break;
        case AuthenticationStatus.Failed:
            break;
        case AuthenticationStatus.Authenticated:
            //log the user in
            break;
    }
}

return new EmptyResult();

}

Anbieter:

public ActionResult Index()
{
    IRequest request = OpenIdProvider.GetRequest();

    if (request != null) {
        if (request.IsResponseReady) {
            return OpenIdProvider.PrepareResponse(request).AsActionResult();
        }

        ProviderEndpoint.PendingRequest = (IHostProcessedRequest)request;
        return this.ProcessAuthRequest();
    } else {
        //user stumbled on openid endpoint - 404 maybe?
        return new EmptyResult();
    }
 }

public ActionResult ProcessAuthRequest()
    {
        if (ProviderEndpoint.PendingRequest == null) {
            //there is no pending request
            return new EmptyResult();
        }

        ActionResult response;
        if (this.AutoRespondIfPossible(out response)) {
            return response;
        }

        if (ProviderEndpoint.PendingRequest.Immediate) {
            return this.SendAssertion();
        }

        return new EmptyResult();
    }

Protokolle:

RP: 1)http://pastebin.com/Pnih3ND7 2)http://pastebin.com/eBzGun9y

Anbieter:http://pastebin.com/YAUTBzHk

Interessanterweise besagt das RP-Protokoll, dass localhost nicht vertrauenswürdig ist ... dennoch habe ich es zu den in der Whitelist aufgeführten Hosts in meiner web.config hinzugefügt und es hat gestern "funktioniert" ...

EDIT: Okay, das ist komisch. Gestern bin ich durch die DNOA-Quelle gegangen, um herauszufinden, wo das Problem liegt. Ich habe log4net aktiviert und es hat die Protokolldatei erstellt und leer gelassen. Heute habe ich log4net erneut eingerichtet - es hat sich gut angemeldet, aber ich hatte einen Fehler, der keinen Sinn ergab (siehe oben). Ich war auch nicht in der Lage, in die DNOA-Quelle einzusteigen. Ich entfernte den Verweis auf dotnetopenauth.dll und fügte ihn erneut hinzu. Dann verschwand mein "ursprünglicher Fehler" mit den auf der Whitelist befindlichen Hosts. Ich konnte in die Quelle eintreten, aber die Protokolldatei war wieder leer. Und ich habe immer noch das Problem mit request.form nicht bestückt ...

EDIT2: Meine beiden Controller heißen "OpenIdController" (sowohl auf dem RP als auch auf dem EP). Mein RP läuft auf localhost: 1903 und mein Endpunkt läuft auf localhost: 3314.

EDIT3: Nachdem ich die Änderungen vorgenommen habe, haben Sie vorgeschlagen, dass die Dinge funktionieren. Der RP führt die Ermittlung in Ordnung aus, aber ich habe ein Problem, wenn er die Anforderung tatsächlich ausführt.

Die LinieIRequest i_request = OpenIdProvider.GetRequest(); funktioniert gut, aber wenn ich versuche, es zu besetzen:IAuthenticationRequest iR = (IAuthenticationRequest)i_request; Es gibt mir den folgenden Fehler:

 System.InvalidCastException was unhandled by user code
 Message=Unable to cast object of type     'DotNetOpenAuth.OpenId.Provider.AutoResponsiveRequest' to type 'DotNetOpenAuth.OpenId.Provider.IAuthenticationRequest'.
 Source=Portal
 StackTrace:
   at Portal.Controllers.OpenIdController.Index() in Controllers\OpendIdController.cs:line 35
   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41()
   at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()

Dieser Code ist eine Art Durcheinander zwischen den beiden Beispielen, die ich für relevant befunden habe. Ich möchte eine SSO-Umgebung einrichten, sodass der Großteil des verwendeten Codes von stammt\DotNetOpenAuth-4.1.0.12182\Samples\OpenIdWebRingSsoProvider\Code\Util.cs (ProcessAuthenticationChallenge-Funktion). Da diese Funktion jedoch ein erwartetIAuthenticationRequest aber OpenIdProvider.GetRequest gibt ein zurückAutoResponsiveRequest Ich dachte, ich könnte es gießen, um die Eigenschaften und Methoden von zu nutzenIAuthenticationRequest Klasse. Offensichtlich habe ich mich geirrt.

Ich bin mir nicht ganz sicher, wie ich an dieser Stelle vorgehen soll. Sollte ich den Beispielcode aus dem OpenIdProviderMVC-Beispiel verwenden? Der Schlüssel ist, dass die Anmeldung wie eine einmalige Anmeldung funktioniert und der Benutzer nie zur Eingabe einer OpenId aufgefordert wird. Ich werde auch immer nur einen Endpunkt haben (obwohl ich mehrere RPs haben werde).

Hier ist der Link zu den neuesten RP-Protokollen:http://pastebin.com/enpwYqq3

EDIT4: Ich habe getan, was Sie vorgeschlagen haben, und einige Fortschritte erzielt. Meine EP empfängt die Antwort und verarbeitet sie, soweit ich das beurteilen kann, aber wenn sie zurück zum Realm-URL umleitet, werden Fehler ausgegeben.

012-10-10 13:55:01,171 (GMT-4) [25] ERROR DotNetOpenAuth.Messaging - Protocol error: An HTTP request to the realm URL (http://localhost:1903/) resulted in a redirect, which is not allowed during relying party discovery.

Was genau ist die Funktion desRealm im Gegensatz zu derReturnTo? Mit dem Beispielcode wird der Realm letztendlichhttp://localhost:1903/ und das ReturnTo wirdhttp://localhost:1903/OpenId/Authenticate das scheint in Ordnung. Warum muss das EP eine Anfrage an den Bereich stellen? Ich hätte gedacht, dass es einfach die Behauptung an die returnTo senden sollte, sobald es die Verarbeitung beendet hat. Wenn ich den Realm manuell auf setzehttp://localhost:1903/OpenId/Authenticate dannrelyingParty.GetResponse() gibt null zurück.

Ich habe meine Anwendung so eingerichtet, dass sie umleitet, wenn jemand auf die Basis-URL zugreift (http://localhost:1903) - Welchen Code sollte ich dort ausführen, um die DNOA-EP-Anfrage abzufangen?

Neue Protokolle:

RP:http://pastebin.com/L9K5Yft4

EP:http://pastebin.com/kBPWiUxp

Ich habe auch den Code am Anfang der Frage aktualisiert, um die vorgenommenen Änderungen besser widerzuspiegeln.

EDIT5: Muss der Realm die tatsächliche Basis-URL der Anwendung sein? Das ist, (http://localhost:1903)? Angesichts der vorhandenen Architektur ist es schwierig, die Umleitung zu entfernen. Ich habe versucht, den Realm auf den OpenId-Basiscontroller einzustellen (http://localhost:1903/OpenId) und manuelles Testen haben das XRDS-Dokument erzeugt. Die Anwendung scheint jedoch einzufrieren, und das EP-Protokoll zeigt den folgenden Fehler an:

2012-10-10 15:17:46,000 (GMT-4) [24] ERROR DotNetOpenAuth.OpenId - Attribute Exchange extension did not provide any aliases in the if_available or required lists.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage