2012-10-11 5 views
7

Come continuazione di this question, c'è un problema che sto riscontrando con dotnetopenauth.Un dominio OpenID deve essere l'URL di base del sito web?

Fondamentalmente, mi chiedo se il dominio specificato nell'RP debba essere l'effettivo URL di base dell'applicazione? Cioè, (http://localhost:1903)? Data l'architettura esistente sul posto è difficile rimuovere il reindirizzamento - Ho provato ad impostare il realm al controller OpenId di base (http://localhost:1903/OpenId) e test manualmente ha generato il documento XRDS. Tuttavia, l'applicazione sembra congelarsi, e il registro PE rivela il seguente errore:

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.

Codice:

Basandosi Party:

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(); 

}

Provider:

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(); 
    } 
+0

Puoi approfondire il congelamento? È il browser che si blocca? O la pagina web non cambia in qualche momento nel flusso? Vai a infiniti reindirizzamenti? –

risposta

10

La risposta alla tua domanda è "no". Il dominio può essere qualsiasi URL tra l'URL di base del tuo sito e il tuo return_to URL. Così, per esempio, se l'URL return_to è http://localhost:1903/OpenId/Authenticate, i seguenti sono tutti gli ambiti validi:

  • http://localhost:1903/OpenId/Authenticate
  • http://localhost:1903/OpenId/
  • http://localhost:1903/

Di seguito sono non regni validi, data la return_to above:

  • http://localhost:1903/OpenId/Authenticate/ (barra finale extra)
  • http://localhost:1903/openid/ (maiuscole e minuscole!)
  • https://localhost:1903/ (cambia schema)

Poiché alcuni provider OpenID, come emissione di Google identificatori coppie unici per i propri utenti in base al regno esatto URL, è consigliabile che il tuo reame sia l'URL di base del tuo sito web in modo che sia più stabile (la riprogettazione del tuo sito non la cambierà). È inoltre vivamente consigliato che, se può essere HTTPS, renderlo HTTPS in quanto consente a return_to di essere HTTPS ed è leggermente più sicuro in questo modo (attenua gli attacchi di avvelenamento DNS).

Il motivo dell'errore nel registro è perché il tuo RP crea e aggiunge un'estensione FetchRequest alla richiesta di autenticazione OpenID, ma non hai inizializzato FetchRequest con gli attributi effettivi che stai richiedendo.

Non saprei dirti perché la tua app si blocca, con le informazioni che hai fornito.

+0

Ok, grazie. Lascerò il regno come è allora, dal momento che sembra funzionare. Ho anche rimosso il file fetchrequest e l'errore è andato via."Congelare" era un termine errato per descrivere cosa stava succedendo - ne ho indagato ancora, pubblicherò una nuova domanda. Grazie! – Mansfield