2012-10-11 38 views
7

Là sự tiếp nối của this question, có vấn đề tôi đang gặp phải với dotnetopenauth.Có phải một lĩnh vực OpenID phải là URL cơ sở của trang web không?

Về cơ bản, tôi tự hỏi liệu lĩnh vực được chỉ định trong RP có phải là URL cơ sở thực tế của ứng dụng không? Tức là, (http://localhost:1903)? Do kiến ​​trúc hiện có tại chỗ rất khó để loại bỏ các chuyển hướng - Tôi đã cố gắng thiết lập các lĩnh vực để điều khiển cơ sở OpenId (http://localhost:1903/OpenId) và thử nghiệm bằng tay đã tạo ra các tài liệu XRDS. Tuy nhiên, việc áp dụng dường như đóng băng, và các bản ghi EP cho thấy các lỗi sau:

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.

Code:

Dựa Đảng:

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

Bạn có thể giải thích chi tiết về việc đóng băng không? Có phải trình duyệt bị đóng băng không? Hay trang web không thay đổi tại một thời điểm nào đó trong luồng? Bạn có chuyển hướng vô hạn không? –

Trả lời

10

Câu trả lời cho câu hỏi của bạn là "không". Vương quốc có thể là bất kỳ URL nào giữa URL cơ sở của trang web của bạn và URL return_to của bạn. Vì vậy, ví dụ, nếu URL return_to của bạn là http://localhost:1903/OpenId/Authenticate, sau đây là tất cả cõi hợp lệ:

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

Sau đây là không cõi hợp lệ, do return_to above:

  • http://localhost:1903/OpenId/Authenticate/ (thêm dấu slash)
  • http://localhost:1903/openid/ (trường hợp nhạy cảm!)
  • https://localhost:1903/ (chương trình thay đổi)

Bởi vì một số nhà cung cấp OpenID như vấn đề Google định cặp duy nhất cho người dùng của họ dựa trên các lĩnh vực chính xác URL, nó được khuyến khích cho lĩnh vực của bạn để được các URL cơ sở để trang web của bạn để nó ổn định nhất (thiết kế lại trang web của bạn sẽ không thay đổi nó). Chúng tôi cũng khuyên bạn nên chắc chắn rằng nếu HTTPS có thể là HTTPS, điều đó cho phép return_to của bạn trở thành HTTPS và an toàn hơn một chút theo cách đó (nó giảm thiểu các cuộc tấn công ngộ độc DNS).

Lý do lỗi trong nhật ký là do RP của bạn tạo và thêm phần mở rộng FetchRequest vào yêu cầu xác thực OpenID, nhưng bạn chưa khởi tạo FetchRequest với bất kỳ thuộc tính thực tế nào mà bạn đang yêu cầu.

Tôi không thể cho bạn biết lý do tại sao ứng dụng của bạn bị đóng băng, với thông tin bạn đã cung cấp.

+0

Ok, cảm ơn. Tôi sẽ rời khỏi vương quốc như lúc đó vì nó dường như đang hoạt động. Tôi cũng đã xóa tìm nạp và lỗi đã biến mất."Đóng băng" là một thuật ngữ không chính xác để mô tả những gì đang xảy ra - Tôi đã điều tra thêm một số, tôi sẽ đăng một câu hỏi mới. Cảm ơn! – Mansfield

Các vấn đề liên quan