カスタムログインASP.NET C#
-
25-10-2019 - |
質問
現在、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などの特定のページから制限するにはどうすればよいですか?私は現在、理解しようとしています これ.
どんな助けも大歓迎です;)
前もって感謝します
解決
わかりました、だから私はこれを言うつもりですが、私はそれを可能な限り素晴らしい方法で意味することを知っています...
それは間違っている!
私はASP.NETですが、カスタムデータベースの使用に反対していません すでにこれを組み込んでいます。 あなたが非常に使用できるとき、私はこれを方法でこれをコーディングすることに反対することさえしていません 素敵なプラグ可能なプロバイダーモデル ASP.NETが組み込んでいること。私が反対しているのは、このコードがどれほど広く開いているかということです SQLインジェクション攻撃。
入力した場合に何が起こるかを考えてみてください x'; DROP TABLE Users; --
ユーザー名として? 悪いことの男!!!!
わかりました、私がそこに入れたリンクに真剣に従ってください。少なくともお願いします パラメーター化されたクエリを使用してください!
他のヒント
あなたが投稿したコードにはかなりの問題があります。
string strSQL = "Select * from dbo.Users where Username ='" + uname + "' and Password ='" + password + "'";
クエリを構築するために文字列連結を行うことはありません。 これにより、アプリケーションはSQLインジェクションに開放されます。代わりにパラメータ化されたクエリを使用します。
管理者と一般ユーザー向けの別のデータベースがあるのはなぜですか?すべてのログインを単一のデータベースに単一のテーブルに保存しませんか。次に、単一のフィールド「isAdmin」を使用するか、別の役割テーブルとusersInrolesテーブルを使用して、どのユーザーが管理者であるかを判断します。
ビルトインメンバーシッププロバイダーを使用しない理由は何ですか? appData aspnet.mdfだけでなく、任意のデータベースを使用するようにビルトインプロバイダーを構成します。
通常、ロールを使用して異なるページを異なるユーザーに制限します。これは、承認要素内のweb.configファイルで設定できます。
カスタムのシンプルな認証システムを本当に作成したい場合は、次のようなものを使用してください http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-rols-aspnet.htmlユーザーの役割をユーザーIDに手動で割り当てる。
ハードコードデータベース接続パラメーターはまったくすべきではないと思います。 DBが変更された場合、再コンパイルする必要があるため、悪い習慣です。したがって、あなたがしなければならないことは、カスタムメンバーシップとロールプロバイダーを実装することです。見る この記事。 基本的に、system.web.security.roleprovider and system.web.security.membershipproviderから継承するカスタムクラスを作成する必要があります。メンバーシップは、ユーザーと役割を管理します。
すべてが設定されたら、ASPX Page Code-BehindファイルのPage.userプロパティを介してユーザー許可を確認できます。
私の声をミックスに追加します。歴史から学ばない人はそれを繰り返す運命にあります。 ASP.NETメンバーシップシステムは、独自のユーザー認証システムを実装しようとする長年の人々の結果です。 Microsoftはそれから学んだ。あなたはそうすべきです。
メンバーシッププロバイダーモデルを使用します。デフォルトのプロバイダーを使用したくない場合は、独自のカスタムプロバイダーを実装してください。しかし、正直なところ、ビルトインプロバイダーを使用して、必要なものに適応するのは非常に簡単です。