2012-10-11 15 views
7

Jako kontynuacja this question, istnieje problem z dotnetopenauth.Czy dziedzina OpenID musi być podstawowym adresem URL strony internetowej?

W zasadzie zastanawiam się, czy dziedzina określona w RP musi być faktycznym podstawowym adresem URL aplikacji? To znaczy (http://localhost:1903)? Biorąc pod uwagę istniejącą architekturę, trudno jest usunąć przekierowanie - próbowałem ustawić dziedzinę do podstawowego kontrolera OpenId (http://localhost:1903/OpenId), a testowanie ręcznie wygenerowało dokument XRDS. Jednakże zastosowanie wydaje się zamrażać, a dziennik EP ujawnia następujący błąd:

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.

Kod:

Powołując 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

Czy możesz opracować zamrożenie? Czy to przeglądarka zawiesza się? A może strona internetowa po prostu się nie zmienia w pewnym momencie przepływu? Czy wchodzisz w nieskończone przekierowania? –

Odpowiedz

10

Odpowiedź na twoje pytanie brzmi "nie". Dziedziną może być dowolny adres URL między podstawowym adresem URL witryny a Twoim adresem URL zwrotem. Tak na przykład, jeśli return_to URL http://localhost:1903/OpenId/Authenticate, następujące są wszystkie ważne sfery:

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

Poniżej nie ważne sfery, biorąc pod uwagę return_to above:

  • http://localhost:1903/OpenId/Authenticate/ (extra trailing slash)
  • http://localhost:1903/openid/ (wielkość liter ma znaczenie!)
  • https://localhost:1903/ (zmiana programu)

Ponieważ niektórzy dostawcy OpenID takie jak Google emisji parami unikalnych identyfikatorów dla swoich użytkowników na podstawie dokładnej królestwa URL, wskazane jest, aby twoje królestwo było podstawowym adresem URL Twojej strony internetowej, aby było najbardziej stabilne (zmiana wyglądu witryny nie zmieni tego). Zaleca się także, aby w przypadku protokołu HTTPS ustawić go jako HTTPS, który pozwala, aby return_to było HTTPS i jest nieco bezpieczniejsze (zmniejsza ryzyko ataków DNS).

Przyczyną błędu w dzienniku jest to, że twój komputer RP tworzy i dodaje rozszerzenie FetchRequest do żądania uwierzytelnienia OpenID, ale nie zainicjowałeś FetchRequest z żadnymi rzeczywistymi atrybutami, których żądasz.

Nie mogłem Ci powiedzieć, dlaczego Twoja aplikacja zawiesza się, dzięki podanym przez Ciebie informacjom.

+0

OK, dzięki. Opuszczę królestwo, ponieważ wtedy wydaje się, że działa. Usunąłem też żądanie pobrania i błąd zniknął."Zamrożenie" było niepoprawnym terminem opisującym to, co się dzieje - zbadałem trochę więcej, opublikuję nowe pytanie. Dzięki! – Mansfield

Powiązane problemy