2012-01-10 25 views
0

を示すクライアント上でログインしているユーザー:Login.aspxの、Index.aspxとC#クラス・ファイルは、名前のGlobalData.cs私は3つのページを持っている他のページへ

Googleからのユーザー情報を取得するための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(); 
    } 



} 
} 

今、私は私がOpenIDのを使用するための私のウェブページのためのfacing.Myメカニズムは、ユーザーがログインをクリックしたときにということですよ私の深刻な問題を書いていますボタンをLogin.aspxで実行すると、ユーザーはgoogleから認証された後、ユーザーはGoogleに戻ります。ユーザーはIndex.aspxに戻ってきます。INdex.aspxここで私は自分のDBからユーザーを再認証しました。私のDBには、ユーザーがページを表示する必要があり、電子メールdntがDBに存在する場合、ユーザーはLogin.aspx.Okにリダイレクトする問題は次のとおりです。GoogleとMy Own DBの両方から認証した後、Index.aspxにログインしたときndex.aspx電子メールのフルネームなどの正確な情報を表示Index.aspx.andで、他のブラウザまたはPCまたはセッションからIndex.aspxにログインすると、ユーザーもIndex.aspxにログインしたSuccesfuly.And最初に記録されたインデックス.aspxすると、現在のIndex.aspxページに2番目のログインしたユーザー情報が表示されます。複数のユーザーがIndex.aspxにログインしようとすると、Index.aspx上の各更新時にIndexへの最後のユーザーログインの情報が表示されます。 aspx on Index.aspx.Can誰にでも教えてください私が正確に何を忘れているのかこの問題がなぜ表示されているのですか?私はすべてのコードをすべてのページに入れてくださいコードに追加したりコードから取り除かなければならないものを手伝ってください

+0

なぜ静的フィールドを最初に使用していますか? Webアプリケーションを開発する場合(基本的な技術に関係なく)、ここで説明するような醜いバグを防ぐために、関連するすべてのユーザをそれぞれのセッションに保存する必要があります。静的フィールドには、ウェブサーバが古いプロセスを再利用するのではなく、新しいプロセスを開始することを決定したときに、削除の可能性があるという欠点もあります(たとえば、古いプロセスをシャットダウンした後など)。 – Nuffin

+0

少しASP.NETセッション変数にしてみてください?将来的にはもっと問題があれば助けてくれるのはうれしいですが、それは私があなたのためにあなたの仕事をすることを意味するものではありません(また、ASP.NETを書き続けたい場合は、同時マルチユーザアクセスが可能でなければならないアプリ)。 – Nuffin

+0

セッション変数は、セッションが開始されたとき、つまりセッションを開始したときにのみ有効です。つまり、ユーザーがログインしたときです。以前に使用したのと同じグローバル変数から実際に使用する直前に初期化するので、変更はありません。 – Nuffin

答えて

2

ユーザーレベルは決して静的に格納することはできません。静的なプロパティは、本質的に1人のユーザーだけがあなたのサイトにログインし、最後にログインした人の情報になることを意味します。セッションでこれらの値を保存するようにコードを変更すると、この問題は解消されます。

EDIT:それは何が起こっているのか伝えるのは難しいのですが、これはまだ、静的なように見えるので、あなたはこれを交換する必要があります。これにより

GlobalData.Email = Testresponse.GetAttributeValue(WellKnownAttributes.Contact.Email) ; 
GlobalData.Name = Testresponse.GetAttributeValue(WellKnownAttributes.Name.First) ; 
GlobalData.LastName = Testresponse.GetAttributeValue(WellKnownAttributes.Name.Last); 

:ので、もう一度

Session["U_Email"] = Testresponse.GetAttributeValue(WellKnownAttributes.Contact.Email) ; 
Session["U_Name"] = Testresponse.GetAttributeValue(WellKnownAttributes.Name.First) ; 
Session["U_LastName"] = Testresponse.GetAttributeValue(WellKnownAttributes.Name.Last); 

、あなたをGlobalDataは静的なので使用できません。

+0

問題の説明に緊急に編集が必要です... Googleから翻訳して貼り付けたようですが、解決策を投稿したときに編集の途中でした – Rafael

+0

誰でも私にHOwとセッション変数を使用して解決を指示することができます私のPRoblem –

+0

AnyOne私の更新をチェックしてください私はクラスから静的を削除し、ユーザの情報を保存するためにセッション変数を使用しました。しかし、状況は同じです –

関連する問題