Зарегистрированный пользователь на клиенте показывает на другой странице - PullRequest
0 голосов
/ 10 января 2012

У меня есть три страницы: Login.aspx, Index.aspx и файл класса C # с именем GlobalData.cs

Код, указанный за Login.aspx, для получения информации о пользователе от Google и для отображения на 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 для моей веб-страницы заключается в том, что, когда пользователь нажимает кнопку «Войти» на Login.aspx, он переводит пользователя в почту Google после аутентификации в Google, когда пользователь возвращается к Index.aspx.А вот здесь, на INdex.aspx, я заново аутентифицировал пользователя из моей собственной БД, что если электронная почта, возвращенная Google, существует в моей БД, то пользователь должен просмотреть страницу, а если электронная почта не существует в БД, то пользователь Переадресация на Login.aspx.Ok Теперь проблема в том, что когда я вошел в Index.aspx после аутентификации как в Google, так и в Моей собственной БД, Index.aspx отображает точную информацию, такую ​​как полное имя электронной почты и т. Д. На Index.aspx.и означает, что при входе в систему в Index.aspx из любого другого браузера или ПК или сеанса, а затем также пользователь вошел в Index.aspx Succesfuly. И когда я обновляю First Logged Index.aspx, он отображает информацию о втором зарегистрированном пользователе на текущей странице Index.aspx. Несколько пользователей пытаются войти в Index.as px затем При каждом обновлении на Index.aspx выводится информация о последнем входе пользователя в Index.aspx на Index.aspx.Can Кто-нибудь скажет мне, что именно я пропускаю Вот почему отображается эта проблема. Я установил весь код на всех страницах помогите пожалуйста что добавить в код или удалить из кода

1 Ответ

2 голосов
/ 10 января 2012

Информация, хранящаяся на уровне пользователя, никогда не может храниться в статике.Статическое свойство, по сути, означает, что только один пользователь будет когда-либо входить на ваш сайт, и это будет информация последнего человека, который вошел в систему. Измените код, чтобы сохранить эти значения в сеансе, и тогда эта проблема исчезнет.

РЕДАКТИРОВАТЬ: Трудно сказать, что происходит, но это все еще выглядит как статический, поэтому вам нужно заменить это:

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, поскольку он статический.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...