我有三个页面:为Login.aspx,Index.aspx的和C#类文件名为GlobalData.cs登录的用户在客户端显示到其他网页
中的Login.aspx背后的代码从谷歌获取用户信息并显示在Index.aspx的
这里是代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DotNetOpenAuth.OpenId;
using DotNetOpenAuth.OpenId.RelyingParty;
using OpenIdTest;
using DotNetOpenAuth.OpenId.Extensions.SimpleRegistration;
using System.Web.Security;
using DotNetOpenAuth.OpenId.Extensions.AttributeExchange;
public partial class Account_Login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
FuncOpenID();
}
protected void FuncOpenID()
{
OpenIdRelyingParty OIDRP = new OpenIdRelyingParty();
var response = OIDRP.GetResponse();
if (response != null)
{
switch (response.Status)
{
case AuthenticationStatus.Authenticated:
var fetchResponse = response.GetExtension<FetchResponse>();
Session["GoogleIdentifier"] = fetchResponse;
var Testresponse = Session["GoogleIdentifier"] as FetchResponse;
GlobalData.Email = Testresponse.GetAttributeValue(WellKnownAttributes.Contact.Email) ;
GlobalData.Name = Testresponse.GetAttributeValue(WellKnownAttributes.Name.First) ;
GlobalData.LastName = Testresponse.GetAttributeValue(WellKnownAttributes.Name.Last);
FormsAuthentication.RedirectFromLoginPage(GlobalData.Email, false); //(response.ClaimedIdentifier, false);
FormsAuthentication.RedirectFromLoginPage(GlobalData.Name, false);
FormsAuthentication.RedirectFromLoginPage(GlobalData.LastName, false);
break;
case AuthenticationStatus.Canceled:
break;
case AuthenticationStatus.Failed:
break;
}
}
}
protected void OpenLogin_Click(object src, CommandEventArgs e)
{
string StrUri = e.CommandArgument.ToString();
OpenIdRelyingParty openid = new OpenIdRelyingParty();
var b = new UriBuilder(Request.Url) { Query = "" };
var req = openid.CreateRequest(StrUri);
var fetchRequest = new FetchRequest();
fetchRequest.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
fetchRequest.Attributes.AddRequired(WellKnownAttributes.Name.First);
fetchRequest.Attributes.AddRequired(WellKnownAttributes.Name.Last);
req.AddExtension(fetchRequest);
req.RedirectToProvider();
}
protected void btnLoginToGoogle_Click(object sender, EventArgs e)
{
}
}
更新 和类文件后面的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace OpenIdTest
{
public class GlobalData
{
public string Email = "";
public string Name = "";
public string LastName = "";
public string test = "";
public string FullName = "";
}
而且Index.aspx的后面的代码如下:
namespace OpenIdTest
{
public partial class Rights : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Session["U_EMAIL"] = GlobalData.Email;
Session["U_NAME"] = GlobalData.Name;
Session["U_LASTNAME"] = GlobalData.LastName;
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=|DataDirectory|OID.mdb;Persist Security Info=False;");
con.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.CommandText = "Select * from EMAILS WHERE FLAG='Allowed' and EMAIL= '" + GlobalData.Email + "'";
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
foreach (DataRow row in ds.Tables[0].Rows)
{
String email = row["EMAIL"].ToString();
if (email == null)
{
Response.Redirect("Login.aspx");
}
else
{
Label2.Text = Session["U_EMAIL"].ToString();
Label1.Text = Session["U_NAME"].ToString();
Label3.Text = Session["U_LASTNAME"].ToString();
Label1.Visible = false;
Label3.Visible = false;
Label4.Text = Label1.Text + ' ' + Label3.Text;
}
}
con.Close();
}
}
}
现在,我写我的严重的问题,对此我facing.My机制我的网页上使用OpenID的是,当用户点击登录按钮Login.aspx它需要用户谷歌邮件认证后,从谷歌用户回到Index.aspx.And这里INdex.aspx我已经从mY自己的数据库重新认证用户,如果谷歌已经返回的电子邮件存在在我的数据库然后用户应该查看页面,如果电子邮件dnt存在数据库然后用户重定向到Login.aspx.Ok现在的问题是,当我登录到Index.aspx从谷歌和我自己的数据库认证后,我ndex.aspx显示准确的信息,如电子邮件全名等在Index.aspx.and意思是,如果我从任何其他浏览器或PC或会话登录到Index.aspx,然后也用户登录到Index.aspx Succesfuly.And当我刷新第一个记录索引.aspx然后它显示当前Index.aspx page上的第二个登录用户信息。它表示当多个用户尝试登录到Index.aspx时,然后在每次刷新时Index.aspx将上次用户登录的信息显示为Index。 aspx on Index.aspx.Can任何人都可以告诉我我究竟是什么想念这就是为什么这个问题显示。我把所有页面的所有代码请帮助我必须添加代码或从代码中删除
为什么你首先使用静态字段?在开发Web应用程序时(无论基础技术如何),与用户相关的所有内容都应存储在各自的用户会话中,以防止这里描述的丑陋的错误。静态字段的缺点是,当Web服务器决定启动一个新进程而不是重新使用旧进程时(例如关闭旧进程之后不会被访问)时,可能会删除。 – Nuffin 2012-01-10 13:28:29
为什么你不看一点点到ASP.NET会话变量和尝试自己?如果将来出现更多问题,我很乐意提供帮助,但这并不意味着我会为您做好工作(并且您必须以任何方式学习,如果您想继续编写ASP.NET需要能够同时进行多用户访问的应用程序)。 – Nuffin 2012-01-10 13:52:58
会话变量只有在会话开始时设置它们时才有用,换句话说:一旦用户登录。由于您在从之前使用的相同全局变量实际使用它们之前初始化它们,因此没有任何更改。 – Nuffin 2012-01-11 08:01:42