2014-10-28 47 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

相关问题