2014-10-28 17 views
0

我在登錄過程中遇到問題,只發生在解決此問題相當尷尬的現場服務器上。我也很關心爲什麼這種情況似乎只發生在現場服務器以及問題本身上。我有三個實例的系統,我在Visual Studio中開發並使用IISExpress進行開發和調試,我也有一個人造的「分段」實例,我使用本地SSL保護的IIS網站,然後我有生活生產環境在我網絡託管公司在虛擬專用服務器。只在現場製作服務器上的DNOA錯誤

我只在VDS的託管版本上看到過這個問題。

該網站由一個MVC4網站和託管在服務器上單獨的IIS站點中的受OAuth保護的API組成。

問題

當登錄到生產現場似乎在登錄過程中打嗝,並呈現登錄屏幕用戶的兩倍。再次點擊登錄,用戶就可以正常登錄。

DNOA錯誤消息

DotNetOpenAuth.Messaging.ProtocolException:與回調的客戶端狀態不匹配預期值發生非預期的OAuth授權響應。

碼 - 的AccountController

public ActionResult Login(LoginModel model, string returnUrl) 
{ 
    if (ModelState.IsValid && SecurityClient.Login(model.Email, model.Password, model.RememberMe)) 
    { 
     ObtainApiOAuthTokens(model.Email, returnUrl); 
    } 
} 

public void ObtainMoodexApiOAuthTokens(string userName, string returnUrl) 
{ 
    var scopes = SecurityClient.GetOauthScopesForCurrentUser(userName); 
    _client.GetAuthorised(scopes, returnUrl); 
} 

碼 - APIClient

public void GetAuthorised(IEnumerable<string> scopes, string returnUrl) 
{ 
    if (!string.IsNullOrEmpty(returnUrl)) 
    { 
     var nvc = new NameValueCollection { { "returnUrl", returnUrl } }; 
     RequestUserAuthorization(scopes, new Uri(ConfigurationManager.AppSettings["TokenCallbackUrl"] + nvc.ToQueryString(false))); 
    } 
    else 
    { 
     RequestUserAuthorization(scopes, new Uri(ConfigurationManager.AppSettings["TokenCallbackUrl"])); 
    } 
} 

碼 - 的AccountController - ReadTokens

public ActionResult ReadTokens() 
{ 
    if (!string.IsNullOrEmpty(Request.QueryString["code"])) 
    { 
     try 
     { 
      IAuthorizationState authorization = _client.ProcessUserAuthorization(); 
      authorization.Callback = new Uri(authorization.Callback.GetLeftPart(UriPartial.Path)); 

      if (!string.IsNullOrEmpty(authorization.AccessToken)) 
      { 
       _client.SaveState(authorization); 
      } 
     } 
     catch (ProtocolException ex) 
     { 
      _log.Fatal("Error reading security tokens", ex); 
     } 
    } 

    string[] roles = Roles.GetRolesForUser(User.Identity.Name); 
    if (roles.Contains(AppRole.LicenseManager.ToString())) 
    { 
     return RedirectToAction("index", "licenseadmin", new { @area = "licensemanager" }); 
    } 

    var returnUrl = Request.QueryString["returnUrl"]; 
    if (string.IsNullOrEmpty(returnUrl)) 
    { 
     return RedirectToAction("index", "dashboard"); 
    } 

    return RedirectToLocal(returnUrl); 
} 

由於我將[Authorize]屬性應用於全局過濾器集合,所有未使用[AllowAnonymous]明確「打開」的方法都要求對用戶(請求)進行身份驗證。由於ReadTokens回調在初始Login請求的上下文中執行,因此可以安全地假設這就是用戶被重定向回Login視圖的原因。由於響應沒有被髮送回客戶端,所以請求還沒有被認證。

解決此問題的最佳方法是什麼?此外,如果這是問題的根源,爲什麼只有在使用系統的生產實例時纔會出現此問題?

回答

0

只是爲了在這個問題上的完整性。我最終追查了這個問題。當我部署到生產服務器時,我忽略添加一個XML轉換,對配置文件進行某些更改。

所有其他瀏覽器似乎沒有任何問題,但Chrome並未在後續請求中可靠地返回身份驗證Cookie。

添加轉換後,在cookie上設置domain屬性(例如:.example.com)後,Chrome的問題消失了。

0

出於好奇,請檢查生產服務器上的時鐘是否正確。

+0

Ahhhh好的,會檢查一下。 – Jammer 2014-11-17 10:33:49

+0

Laaaaate答覆,日期和時間在現場機器上是正確的。嗯... – Jammer 2015-03-17 13:36:14

+0

我已經解決了這個問題,並添加了一個答案。 – Jammer 2015-04-06 12:44:52

相關問題