ログインフォームを使ってみた
ASP.NETには標準的にログインに関するフォームだったり、新規ユーザの登録、パスワード忘れに対応するようなクラスが備わっている。
MS-SQLServerだとかと連携する方法は記事が見つかったりするのだが、Oracleに関してはまとまった記事がなくどうしていいのかさっぱりだったのでまとめておく。
前提
ODP.NETが導入済みであること。
あたりになにやらSQLファイルがいっぱいあること。
適当な(適して当たっている)権限が付与されたOracleユーザが使えること。
準備
「<oracle_home>\ASP.NET\SQL\」 にある以下のSQLをSQLPlusあたりで実行
sqlplus user/pass@tnsname @InstallOracleASPNETCommon.sql
sqlplus user/pass@tnsname @InstallOracleMembership.sql
すると、いくつかのテーブルやらビューやらパッケージが作成されます。
ここで作成されたテーブルに認証情報が書かれていく感じです。
ユーザーを作ってみる
画面にCreateUserWizardを貼り付けます。デザインビューから貼り付けるのが簡単でよいでしょう。
E-Mailの登録とか秘密の質問とかいらないので普通に画面から削っておきます。
Web.configの編集
次に、このままだとSQLServerを探しに行ってしまうようなのでWeb.configを編集してOracleに接続しに行くように変えてあげます。
OracleからOracleMenbershipProviderというのが出ているのでそれに変えます。
2カ所くらい追加が必要だと思います。
<system.web>
<membership>
<providers>
<remove name="AspNetSqlMembershipProvider" />
<add name="AspNetSqlMembershipProvider"
type="Oracle.Web.Security.OracleMembershipProvider, Oracle.Web, Version=4.121.2.1,
Culture=neutral, PublicKeyToken=89b483f429c47342"
connectionStringName="XE"
requiresQuestionAndAnswer="false"
requiresUniqueEmail="false" />
</providers>
</membership>
先ほど、秘密の質問とEmailのフォームを削ったのでrequiresQuestionAndAnswerとrequiresUniqueEmailをfalseとしておきます。CreateUserWizardのプロパティとしてもRequireEmailをfalseとする必要があるかもしれません。
<appSettings>
<add key="ValidationSettings:UnobtrusiveValidationMode" value="None"/>
</appSettings>
<connectionStrings>
<add name="XE" connectionString="user id=scott;password=tiger;data source=XE;"/>
</connectionStrings>
connectionStringのユーザとパスワード、データソースの部分は適宜変更してください。
以上で、ユーザ登録できるようになっていると思います。(コードを1行も書かずに)
パスワードも一応暗号化されて登録されているようなのでいい感じです。
ログインしてみる
次に、先のユーザ登録フォームで作ったユーザでログインできるようにしてみます。
本当は、Web.configに定義したmembershipでできればよかったんだけどもやり方うまくわからず。とりあえず、ごり押しで作ってみています。
とりあえず、「Login」を画面に貼り付けます
Authenticateイベントのメソッドを作ります。
そこに、今度はコードを書いていきます。
OracleMembershipProvider omp = new OracleMembershipProvider();
NameValueCollection name = new NameValueCollection();
name.Set("connectionStringName", "XE");
name.Set("requiresQuestionAndAnswer", "false");
name.Set("requiresUniqueEmail", "false");
omp.Initialize("AspNetSqlMembershipProvider",name);if (omp.ValidateUser(LoginForm.UserName, LoginForm.Password))
{
e.Authenticated = true;
}
else
{
e.Authenticated = false;
}
Web.configに書いた情報を読ませてOracleMembershipProviderをインスタンス化する方法がよくわからないので同じ情報を作ってあげてInitizlizeしてあげています。
ValidateUserで認証かけてあげて認証通ればAuthenticatedをtrueに設定するとログインしたことになります。
実際は適宜ログインIDなど必要情報をセッションに持つなどするとよいでしょう。