0

背景 Oracle11gを使用してasp.netメンバーシップを構成しました。IISとOracle11gは、同じマシン上に構成された上で表現します。IIS6にアプリケーションをデプロイするまで、すべてが正常に機能しました。私のアプリケーションは、すでにデータベースにあるユーザーの識別を停止しました。解決策を探すことで、この解決策にたどり着きました。クライアントマシンのVisualStudio2010でweb.configを更新し、IISのそれと一致するようにapplicationNameを設定し、データベースから既存のすべての役割とユーザーレコードを削除しました。次に、WSATを使用して管理者ロールとユーザーを追加しました。また、ユーザーの追加情報を別のテーブル「UserDetails」に保持しているため、OraclesqlDeveloperで次のクエリを実行して管理者の詳細を追加します。

insert into UserDetails (userid, usertypeid) VALUES('BC3008FFFAD24BB995C21E80A4870ABA', 1);  

これでレコードが正常に追加されました。アプリケーションの展開パッケージを作成し、IISに展開しました。Webアプリケーションを参照し、ユーザークレデンシャルを入力しましたが、アプリケーションは私を許可することを拒否しました。

クライアント上のVSからアプリケーションを実行します(何も変更せずに)。これが私のログインページロジックです

login.aspx:

Username: <br />
<asp:TextBox runat="server" ID="txtUserName"></asp:TextBox>
<br />
Password: <br />
<asp:TextBox runat="server" ID="txtPassword" TextMode="Password"></asp:TextBox>
<br />
<asp:Button runat="server" ID="btnLogin" Text="Login" onclick="btnLogin_Click" 
    style="height: 26px" />

login.aspx.cs:

protected void btnLogin_Click(object sender, EventArgs e)
    {
        if (Membership.ValidateUser(username, password))
            {
                MembershipUser user = Membership.GetUser(username);
                FormsAuthentication.SetAuthCookie(username, false);
                Guid guserid = new Guid(user.ProviderUserKey.ToString());
                string userid = Helpers.TranslateOraceEndianUserID(guserid);
                int usertype = UserDetailsBAL.GetUserType(userid);
                if (usertype == 1)
                {
                    Response.Redirect("~/Dashboard.aspx");
                }                    
                else
                {
                    Response.Redirect("Login.aspx?error");
                }
            }
            else
            {
                Response.Redirect("Login.aspx?error");
            }            
    }

ブレークポイントを中に入れるif(Membership.ValidateUser ...と、ユーザーが検証されていることがわかりました。実際の問題はUserDetailsBAL.GetUserType(userid);

問題

GetUserTypeにステップインする

public static int GetUserType(string userid)
    {
        DataTable dt = new DataTable();
        string q = string.Format("SELECT usertypeid from userdetails where userid='{0}'", userid);
        dt = OraDAL.Select(q);
        int usertype = -1;
        if (dt.Rows.Count != 0)
        {
            DataRow dr = dt.Rows[0];
            usertype = int.Parse(dr[0].ToString());
        }

        return usertype;
    }

次にOraDAL.Select(q)

public static DataTable Select(string query)
{
    DataTable dt = new DataTable();
    OracleDataAdapter da = new OracleDataAdapter(query, OpenConn());
    da.Fill(dt);
    return dt;
}

private static string connString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.2)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=xe)));User Id=...;Password=...";
private static OracleConnection conn;

    public static OracleConnection OpenConn()
    {
        if (conn==null)
        {
            conn = new OracleConnection(connString);
        }
        if (conn.State != ConnectionState.Open)
        {
            conn.Open();
        }

        return conn;
    }

クエリがdtを設定していないことに気づきました。私にはすべてがうまくいくようで、行を返すSQLDeveloperで同じクエリを実行しました

ここに画像の説明を入力してください

問題を追跡するために検査できる領域は何ですか?

編集

管理者がサイトにログインしてusertype=2の他のユーザーを作成できるようにするために、 GetUserTypeforをスキップしました。usertype= 1これで、usertype = 2のユーザーがサイトにログインでき、GetUserTypeコードがスムーズに実行されてユーザータイプが返されます。login.aspx.csのコードに変更を加えました。

       Guid guserid = new Guid(user.ProviderUserKey.ToString());
       string userid = Helpers.TranslateOraceEndianUserID(guserid);
       int usertype = UserDetailsBAL.GetUserType(userid);
       if (usertype == 2)
       {
          Response.Redirect("~/Dashboard.aspx");
       } 

Edit2

データベースにusertype2のユーザーがいるので、上記のコードをもう一度変更して、usertype=1でエラーが発生するかどうかを確認しました。

 string userid = Helpers.TranslateOraceEndianUserID(guserid);
 int usertype = UserProfilesBAL.GetUserType(userid);
 if (usertype == 1)
 {
     Response.Redirect("~/Admin/Dashboard.aspx");
 }
 else if (usertype == 2)
 {
      Response.Redirect("~/Dashboard.aspx");
 }

タイプ1のユーザーのクレデンシャルを入力すると、GetUserTypeは何も返さず、ユーザータイプ2のクレデンシャルでログインすると、GetUserTypeはユーザータイプを返します。

これら2つの違いは、usertype = 1の場合、oracle sqldeveloperを使用してuserdetailsテーブルにレコードを手動で入力し、usertype = 2の場合、create userformを使用してusertype2のユーザーを作成すると、コードによってレコードが追加されることです。終わり。

これが私がユーザーを作成し、userdetailsにエントリを作成する方法です

MembershipCreateStatus createStatus;
MembershipUser newUser = Membership.CreateUser(txtUserName.Text, txtUserPass.Text, null, null, null, true, out createStatus);

if (newUser != null)
{
  string userid = Helpers.TranslateOraceEndianUserID(new Guid(newUser.ProviderUserKey.ToString()));

  UserDetailsBAL.AddUserDetails(userid, 2)
} 

AddUserDetailsでは、ユーザー詳細テーブルにレコードを挿入しているだけです。

最悪の部分は、OraDAL.Select以前に私の投稿で言及したメソッドで生成されたクエリです。asp.netで実行した場合の同じクエリはユーザータイプ1に対してnullを返し、変数からSQLDeveloperにコピーアンドペーストするとquery1行が返されます。

4

0 に答える 0