C# 请求和进程用户授权之间的会话更改
我试图实现一个简单的登录页面,将用户重定向到OAuth2.0登录服务器,然后在成功登录后返回回调URL 但是,我不断收到异常,并显示错误消息: 通过回调和接收到意外的OAuth授权响应 与预期值不匹配的客户端状态 通过调试,我注意到调用“RequestUserAuthorization()”之前和之后的会话id是不同的 我从一些SO答案中读到,我需要以某种方式防止会话更改,但不确定在这种情况下如何实现这一点 任何帮助都将不胜感激,谢谢 我的具体实施如下:C# 请求和进程用户授权之间的会话更改,c#,oauth-2.0,dotnetopenauth,C#,Oauth 2.0,Dotnetopenauth,我试图实现一个简单的登录页面,将用户重定向到OAuth2.0登录服务器,然后在成功登录后返回回调URL 但是,我不断收到异常,并显示错误消息: 通过回调和接收到意外的OAuth授权响应 与预期值不匹配的客户端状态 通过调试,我注意到调用“RequestUserAuthorization()”之前和之后的会话id是不同的 我从一些SO答案中读到,我需要以某种方式防止会话更改,但不确定在这种情况下如何实现这一点 任何帮助都将不胜感激,谢谢 我的具体实施如下: private readonly Web
private readonly WebServerClientCustomImpl _oauthClient = new WebServerClientCustomImpl();
public ActionResult Login()
{
IAuthorizationState auth = null;
auth = _oauthClient.ProcessUserAuthorization();
if (auth == null)
{
_oauthClient.RequestUserAuthorization(returnTo: _redirectUrl);
}
else
{
// Save authentication information into cookie.
HttpContext.Response.Cookies.Add(auth.CreateAuthCookie());
return RedirectToAction("Index", "Home");
}
ViewBag.Message = "Future login page...";
return View();
}
若您对SessionId有问题,在大多数情况下更改它意味着该用户的Session对象中并没有任何内容。只需向session添加任何内容,SessionId对用户而言应保持不变:
Session["UserIsHere"] = true;
若您对SessionId有问题,在大多数情况下更改它意味着该用户的Session对象中并没有任何内容。只需向session添加任何内容,SessionId对用户而言应保持不变:
Session["UserIsHere"] = true;
我有相同的信息,但不同的问题 我在GoogleOAuth面板中注册的url(来源和重定向)是以www 一些用户在没有www的情况下访问web,并收到错误消息 i、 e.Google cpanel conf:http://www.somesite.com,重定向至http://www.somesite.com/oauth2 一些用户正在访问http://somesite.com 解决方案: 限制用户仅使用www版本或将裸域重定向到www,因此身份验证请求始终来自Oauth面板中的注册域
希望有帮助 我有相同的信息,但问题不同 我在GoogleOAuth面板中注册的url(来源和重定向)是以www 一些用户在没有www的情况下访问web,并收到错误消息 i、 e.Google cpanel conf:http://www.somesite.com,重定向至http://www.somesite.com/oauth2 一些用户正在访问http://somesite.com 解决方案: 限制用户仅使用www版本或将裸域重定向到www,因此身份验证请求始终来自Oauth面板中的注册域
希望有帮助 会话状态是ASP.NET功能,而不是特定于视图的功能。因此,无论是web窗体还是MVC都无关紧要。@AndrewArnott WebServerClient的RequestUserAuthorization方法会导致控制器启动新会话吗?使用上述方法,在达到RequestUserAuthorization之前,我的会话ID保持不变。上一个会话ID已传递给auth server,但在登录后返回到web客户端时,客户端的会话ID会更改。我也遇到了同样的问题。。。我应该在客户端添加会话变量吗?但是,这是由DotNetOpenAuth引起的还是ASP.NET的正常行为(即:更改SessionId值并导致该错误)?@Kassem-这是正常的会话状态行为(与auth无关)。空会话和相应的ID(在cookie中)不会以任何形式持久化。@AlexeiLevenkov:我明白了。我刚刚尝试在客户端添加会话变量。我在
AuthenticateRequest
事件中的HttpModule
中管理整个身份验证过程。显然,在PostAcquireRequestState
事件之前,ASP.NET不会实例化会话状态。所以我想这可能是我问题的根源?但为什么它有时有效,有时无效呢。我无法找出它失败的特定场景…会话状态是ASP.NET功能,而不是特定于视图的功能。因此,无论是web窗体还是MVC都无关紧要。@AndrewArnott WebServerClient的RequestUserAuthorization方法会导致控制器启动新会话吗?使用上述方法,在达到RequestUserAuthorization之前,我的会话ID保持不变。上一个会话ID已传递给auth server,但在登录后返回到web客户端时,客户端的会话ID会更改。我也遇到了同样的问题。。。我应该在客户端添加会话变量吗?但是,这是由DotNetOpenAuth引起的还是ASP.NET的正常行为(即:更改SessionId值并导致该错误)?@Kassem-这是正常的会话状态行为(与auth无关)。空会话和相应的ID(在cookie中)不会以任何形式持久化。@AlexeiLevenkov:我明白了。我刚刚尝试在客户端添加会话变量。我在AuthenticateRequest
事件中的HttpModule
中管理整个身份验证过程。显然,在PostAcquireRequestState
事件之前,ASP.NET不会实例化会话状态。所以我想这可能是我问题的根源?但为什么它有时有效,有时无效呢。我无法找出它失败的具体场景…我想提醒遇到此问题的任何其他人,请确保在测试时,不要混合使用localhost域和应用程序URL域。。。如果您这样做,来自OAuth服务器的回调将创建一个新会话。您所说的不要混合本地主机域和您的应用程序URL域是什么意思?不明白吗?partI想提醒遇到此问题的任何其他人,请确保在测试时,不要混合本地主机域和您的应用程序URL域。。。如果您这样做,来自OAuth服务器的回调将创建一个新会话。您所说的不要混合本地主机域和应用程序URL域是什么意思?没有得到该部分