11

現在、ASP.NETでカスタムログインを行っています。ログインコントロールのコードを変更して、Aspnetテーブルの代わりにデータベースを使用するようにしました。これが私のコードのサンプルです。

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;


public partial class Login : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    // Custom login control
    protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
    {
        try
        {
            string uname = Login1.UserName.Trim();
            string password = Login1.Password.Trim();

            bool flag = AuthenticateUser(uname, password);
            if (flag == true)
            {
                e.Authenticated = true;
                Login1.DestinationPageUrl = "Default.aspx";
            }
            else
                e.Authenticated = false;
        }
        catch (Exception)
        {
            e.Authenticated = false;
        }
    }

    private bool AuthenticateUser(string uname, string password)
    {
        bool bflag = false;
        string connString = "Server=DEVSERVER;User ID=sa;Password=whatpassword;Database=CommonUser";
string connstring2 = "Server=DEVSERVER;User ID=sa;Password=whatpassword;Database=Admins";
        string strSQL = "Select * from dbo.Users where Username ='" + uname + "' and Password ='" + password + "'";
        DataSet userDS = new DataSet();
        SqlConnection m_conn;
        SqlDataAdapter m_dataAdapter;
        SqlCommand m_Command;
        try
        {
            m_conn = new SqlConnection(connString);
            m_conn.Open();
            m_dataAdapter = new SqlDataAdapter(strSQL, m_conn);
            m_dataAdapter.Fill(userDS);
            m_conn.Close();
        }
        catch (Exception)
        {
            userDS = null;
        }

        if (userDS != null)
        {
            if (userDS.Tables[0].Rows.Count > 0)
                bflag = true;
        }
        return bflag;

    }
}

管理者ユーザー用の別のデータベースがあります。だから私の質問は、どうすれば管理者ユーザーのデータベースをチェックさせることができるかということです。また、〜Admin / AdminPages.aspxなどの特定のページから一般ユーザーを制限するにはどうすればよいですか?私は現在これを理解しようとしています。

どんな助けでも大歓迎です;)

前もって感謝します

4

4 に答える 4

20

わかりました、それで私はこれを言うつもりです、しかし私がそれを可能な限り良い方法で意味することを知っています...

あなたはそれを誤解している!

Asp.Netにはすでにカスタムデータベースが組み込まれていますが、カスタムデータベースの使用に反対しているわけではありません。Asp.Netの非常に優れたプラグイン可能なプロバイダーモデルを使用できる場合は、メソッドでこれを手動でコーディングすることにも反対していません。私が反対しているのは、このコードがSQLインジェクション攻撃に対してどれほど広く開かれているのかということです。

x'; DROP TABLE Users; --ユーザー名として入力するとどうなるか考えてみてください。悪いこと男!!!!

さて、私がそこに置いたリンクを真剣にたどってください。少なくともパラメータ化されたクエリを使用してください!

于 2011-04-28T04:05:27.237 に答える
6

あなたが投稿したコードにはかなりの間違いがあります。

string strSQL = "Select * from dbo.Users where Username ='" + uname + "' and Password ='" + password + "'";

クエリを作成するために文字列の連結を行うことは決してありません。これにより、アプリケーションはSQLインジェクションに対してオープンになります。代わりに、パラメータ化されたクエリを使用してください。

管理者と一般ユーザー用に別々のデータベースがあるのはなぜですか?すべてのログインを単一のデータベースの単一のテーブルに保存しませんか。次に、単一のフィールド「IsAdmin」を使用するか、別のRolesテーブルとUsersInRolesテーブルを使用して、どのユーザーが管理者であるかを判別します。

組み込みのメンバーシッププロバイダーを使用しない理由は何ですか?AppData \ aspnet.mdfだけでなく、任意のデータベースを使用するように組み込みプロバイダーを構成します。

通常、ロールを使用してさまざまなページをさまざまなユーザーに制限します。これは、authorization要素内のweb.configファイルで設定できます。

本当にカスタムの単純な認証システムを作成したい場合は、http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.htmlのようなものを使用 して、ユーザーロールをユーザーIDに手動で割り当てます。

于 2011-04-28T04:12:05.677 に答える
3

ミックスに私の声を加えるため。歴史から学ばない人はそれを繰り返す運命にあります。ASP.NETメンバーシップシステムは、何年にもわたって独自のユーザー認証システムを実装しようとした結果です。マイクロソフトはそれから学びました。だからあなたはすべきです。

メンバーシッププロバイダーモデルを使用します。デフォルトのプロバイダーを使用したくない場合は、独自のカスタムプロバイダーを実装してください。しかし、正直なところ、組み込みのプロバイダーを使用して、必要なものに適応させるのは非常に簡単です。

于 2011-04-28T04:15:41.787 に答える
2

データベース接続パラメータをハードコーディングするべきではないと本当に思います。DBが変更された場合、再コンパイルする必要があるため、これは悪い習慣です。したがって、あなたがしなければならないことは、カスタムメンバーシップとロールプロバイダーを実装することです。この記事を参照してください。基本的に、System.Web.Security.RoleProviderおよびSystem.Web.Security.MembershipProviderから継承するカスタムクラスを作成する必要があります。メンバーシップは、ユーザーとロールを管理します。ユーザー権限。

すべて設定したら、aspxページの分離ファイルのPage.Userプロパティを使用してユーザー権限を確認できます。

于 2011-04-28T04:02:02.007 に答える