ASP.NET 2.0 では、新しく追加されたメンバーシップ プロバイダー機能と、一連の強力な登録およびログイン コントロールを組み合わせることで、ユーザーのログインとアクセス許可を簡単に管理できます (<<ASP.NET 2.0 ログイン コントロールの概要 >> を参照)。
ただし、ASP.NET 2.0 に付属するログイン コントロールとメンバーシップ管理機能はデフォルトで SQL Server 2005 Express で使用される場合があります。では、SQL Server 2000 またはアクセスなどの他のデータ ソースを使用するように変更するにはどうすればよいでしょうか。 、オラクルなど?アプリケーション内のログイン ユーザーまたはユーザー権限を管理するためにアプリケーションを書き換えたい場合、どのように変更すればよいでしょうか?この記事では、ASP.NET 2.0 でカスタム プロバイダーを使用してログイン コントロールと連携し、簡単なログイン プロセスを実装する方法を説明します。
ASP.NET 2.0 のプロバイダーがどのように動作するかを理解するには、まず次の構造図を見てください。
フィールド名 データ型 フィールドサイズ ユーザー名 (キー) テキスト 8 パスワードテキスト8 メール本文 50 パスワード質問テキスト 50 パスワード回答テキスト 50 |
パブリック クラス ModifiedSqlMembershipProvider SqlMembershipProvider の継承 パブリックオーバーライド関数 CreateUser (...) ... 終了機能 ... End Class |
Visual Studio 2005 beta 2 で提供される SqlMembershipProvider を使用しない場合は、独自のクラスを宣言して MembershipProvider クラスを継承するだけで済みます。 MembershipProvider クラスには、メンバーシップ関連のメソッドとプロパティが含まれています。
ソリューション エクスプローラーで、[新しい項目の追加..] を使用してクラスを追加し、AccessMembershipProvider.vb という名前を付け、システム プロンプトに従って App_Code ディレクトリに配置します。
次に、関連する名前空間を参照し、プログラムのフレームワークを次のように記述します
。
System.Data
パブリック クラス AccessMembershipProvider
をインポートします。
MembershipProvider を継承します
カスタムプロバイダーを使用するには、
エンドクラスは
web.config で関連する構成を行う必要があります。新しい web.config ファイルを追加し、次のコードを記述できます:
<system.web>
<認証モード="フォーム"/>
<メンバーシップ
defaultProvider="AccessMembershipProvider" >
<プロバイダー>
<add name="アクセスメンバーシッププロバイダー"
type="アクセスメンバーシッププロバイダー"
質問と回答 = "true" が必要です
connectionString="プロバイダー=Microsoft.Jet.
OLEDB.4.0;データ ソース=C:NewMembershipProvider
App_DataMembers.mdb;セキュリティを維持する
情報=False" />
</プロバイダ>
</メンバーシップ>
この
うち、次の点に注意してください。
認証方法は「Forms」(authentication mode="forms") を選択する必要があります。
<add> タグを使用して、AccessMembershipProvider という名前のカスタム プロバイダーを追加します。 。
RequiredQuestionAndAnswer 属性の値が true の場合、新規登録中にプロンプトの質問と回答が必要な回答を入力する必要があることを示します。
ConnectionString は、データベースに接続するための接続文字列を示します。
システムでは複数のプロバイダーを設定できるため、DefaultProvider 属性はシステムがデフォルトで使用するプロバイダーを示します。AccessMembershipProvider.vb
に次のプライベート メンバー
Private connStr As String
を追加します。
新しい OleDb.OleDbCommand としてのプライベート通信
ブール値としてのプライベート _requiresQuestionAndAnswer
Private _minRequiredPasswordLength As Integer
に Initialize() メソッドを追加すると、コードは次のとおりです
Public Overrides Sub Initialize(ByVal name As String, ByVal config As System.Collections.Specialized.NameValueCollection)
'===で設定された属性値を取得します
'web.config をローカル変数に代入===
config("requiresQuestionAndAnswer") = "true" の場合、_
_requires質問と回答 = True
connStr = config("接続文字列")
MyBase.Initialize(名前, 構成)
End Sub
プロバイダーがロードされると、Initialize() メソッドが呼び出されます。先ほどのweb.configファイルでは、<add>タグを使って設定した各種属性値をこのメソッドで読み込むことができます。たとえば、上のコードでは、config("connectionString") を使用してデータベース接続文字列を読み取り、それを変数 connStr 変数に入れます。その後、RequiresQuestionAndAnswer プロパティを次のように設定します。
Public Overrides ReadOnly プロパティ _
RequiresQuestionAndAnswer() _
ブール値として
得る
_requiresQuestionAndAnswer = True の場合
True を返す
それ以外
Falseを返す
終了の場合
終了取得
End プロパティ
このプロパティの値を設定する必要があることに注意してください。設定しないと、CreateUserWizard コントロールにパスワード プロンプトの質問とパスワード プロンプトの回答の 2 つのテキスト ボックスが表示されません。
次に、新しいユーザーを作成するためのコードの作成を開始できます。 CreateUser() メソッドのコードは次のとおりです。
Public Overrides Function CreateUser(ByVal username As String, ByVal password As String, ByVal email As String, ByVal passwordQuestion As String) 、ByValpasswordAnswerAsString、ByValisApprovedAsBoolean、ByValproviderUserKeyAsObject、ByRefstatusAsSystem.Web.Security.MembershipCreateStatus)As System.Web.Security.MembershipUser
新しい OleDb.OleDbConnection(connStr) としての Dim conn
試す
conn.Open()
Dim sql As String = "メンバーシップ値に挿入 (" & _
"@ユーザー名、@パスワード、@メールアドレス、" & _
「 @passwordQuestion、@passwordAnswer )」
Dim comm As New OleDb.OleDbCommand(sql, conn)
comm.Parameters.AddWithValue("@ユーザー名", ユーザー名)
comm.Parameters.AddWithValue("@パスワード", パスワード)
comm.Parameters.AddWithValue("@email", 電子メール)
comm.Parameters.AddWithValue("@passwordQuestion",passwordQuestion)
comm.Parameters.AddWithValue("@passwordAnswer",passwordAnswer)
Dim 結果 As Integer = comm.ExecuteNonQuery()
conn.Close()
ステータス = MembershipCreateStatus.Success
Dim user As New MembershipUser("AccessMembershipProvider", ユーザー名, なし, 電子メール, パスワード質問, なし, True, False, Now, なし, なし, なし, なし)
リターンユーザー
元を例外としてキャッチ
ステータス = MembershipCreateStatus.UserRejected
何も返さない
試行を終了する
関数の終了
上記のコードを解釈してみましょう。まず、新しいユーザーが正常に追加された後、ステータス情報ステータスを返す必要があります (ステータスは System.Web.Security .MembershipCreateStatus として ByRef ステータスとして渡されます)。メソッド)、MembershipUser クラスのインスタンスを返したいので、次の方法でそのインスタンスを返します:
Dim user As New MembershipUser("AccessMembershipProvider", username, Nothing, email, passwordQuestion, Nothing, True , False, Now, Nothing、Nothing、Nothing、Nothing)
その中には、MembershipUser クラスのメソッドを使用するコンストラクターが多数あります。詳細については、MSDN を確認してください。ここでは、username、email、passwordQuestion、createddate (アカウント作成日は現在です) のみを使用します。ここで使用されます)。
ログイン ページで、正規のユーザーがログインしているかどうかを判断するには、次のコードを記述する必要があります。
Public Overrides Function ValidateUser( _
ByVal ユーザー名を文字列として、_
ByVal パスワード As String) As Boolean
Dim conn As New OleDb.OleDbConnection(connStr)
試す
conn.Open()
Dim SQL As String = _
「メンバーシップ WHERE から * を選択」 & _
"ユーザー名=@ユーザー名ANDパスワード=@パスワード"
Dim comm As New OleDb.OleDbCommand(sql, conn)
comm.Parameters.AddWithValue("@ユーザー名", _
ユーザー名)
comm.Parameters.AddWithValue("@パスワード", _
パスワード)
Dim リーダー As OleDb.OleDbDataReader = _
comm.ExecuteReader
Reader.HasRows の場合
True を返す
それ以外
Falseを返す
終了の場合
conn.Close()
ex を例外としてキャッチ
Console.Write(ex.ToString)
Falseを返す
試行を終了する
End Function は
このようにして、ログインや登録などのコントロールで利用できるシンプルなカスタムプロバイダーが完成します。プログラムを実行すると、最初にユーザー登録ページが表示され、ユーザーが正常に登録されると、次の図に示すようにログイン ページが表示されます。