我在登錄過程中遇到問題,只發生在解決此問題相當尷尬的現場服務器上。我也很關心爲什麼這種情況似乎只發生在現場服務器以及問題本身上。我有三個實例的系統,我在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
視圖的原因。由於響應沒有被髮送回客戶端,所以請求還沒有被認證。
解決此問題的最佳方法是什麼?此外,如果這是問題的根源,爲什麼只有在使用系統的生產實例時纔會出現此問題?
Ahhhh好的,會檢查一下。 – Jammer 2014-11-17 10:33:49
Laaaaate答覆,日期和時間在現場機器上是正確的。嗯... – Jammer 2015-03-17 13:36:14
我已經解決了這個問題,並添加了一個答案。 – Jammer 2015-04-06 12:44:52