我们在.NET 3.5中创建了一个具有多路复用成员资格/角色提供程序的站点,以及一个使用相同用户(或部分至少)的连接PHP站点(在不同的服务器上),我们正在研究使用的可能性单点登录,我想知道其他人是否做过这样的工作。
当PHP站点的身份验证完成后,它会使用用户ID设置会话变量,然后将用户重定向到起始页。
将来它意味着用户总是登录ASP.NET站点,所以我所做的就是尝试在ASP.NET上同时在PHP站点上进行身份验证。为了能够使用用户的密码,我在membershipprovider中的ValidateUser方法中添加了逻辑:
HttpWebRequest req = HttpWebRequest.Create(url) as HttpWebRequest;
string data = string.Format("username={0}&password={1}", MembershipHelper.UrlEncode(username), MembershipHelper.UrlEncode(password));
req.Method = WebRequestMethods.Http.Post;
req.ContentLength = data.Length;
req.ContentType = "application/x-www-form-urlencoded";
req.AllowAutoRedirect = false;
req.CookieContainer = new CookieContainer();
StreamWriter w = new StreamWriter(req.GetRequestStream());
w.Write(data);
w.Close();
但是你可以理解,它不起作用。当我访问php网站时,我仍然没有登录,这当然与会话有关,但我无法弄清楚如何正确传输它。
答案 0 :(得分:3)
您显示的代码向PHP站点执行服务器端请求,并传递用户名和密码以执行身份验证。您还使用cookie容器来存储PHP站点发出的会话cookie。
如果身份验证成功,则必须从容器中检索会话cookie(使用GetCookies方法)并将其发送到ASP.NET页面的响应中(使用AppendCookie)。这样,cookie将存储在客户端浏览器(而不是临时cookie容器)上。一旦cookie存储在用户的浏览器中,它将自动沿着下一个请求发送到PHP站点(假设此站点与ASP.NET站点位于同一个域中),您将登录。
如果两个站点都托管在不同的域上,那么使用cookie执行单点登录可能会比较棘手。