喜帳面の日記

50歳越えおやじのASP.NET MVC への挑戦日記です。

Visual Studio Express 2012 for Web でいってみる 3.ログイン認証あたり

Visual Studio Express 2012 for WebでMVC4の「Internet Application」テンプレートで新しいプロジェクトを作成すると、ログインやらユーザー登録機能がデフォルトで作成されますが、そのあたりについてのメモです。

 初心者が行き当たりばったりにいろいろ動かしてみたときのメモなので記載内容には勝手な解釈や誤りもあるかと思います。そのあたりのご指摘よろしくお願いします。

『ユーザー名やパスワードはいったいどこに格納されるんだろう?』

という単純な疑問からの出発です。

 

1.新しいプロジェクトの作成

f:id:SannomiyaNotes:20120905115005p:plain

テンプレートは C#の MVC4 Webアプリケーションを指定してます。

2.テンプレートの選択ページでは

f:id:SannomiyaNotes:20120905115643p:plain

「インターネットアプリケーション」を指定して「OK」押すと。

 

3.プロジェクトの出来上がりです。

f:id:SannomiyaNotes:20120905115724p:plain

 

4.デバッグを実行

[Views]-[Home]-[Index.cshtml]あたりを表示させた状態で[F5]を押してデバッグを実行。

f:id:SannomiyaNotes:20120905120222p:plain

 このページの右上にある[ログイン]押すと。

5.ログイン画面が表示されました。

f:id:SannomiyaNotes:20120905120407p:plain

『アカウントをお持ちでない場合は、登録してください。』

の[登録]を押すと。

6.アカウントの登録ページが表示されます。

f:id:SannomiyaNotes:20120905120536p:plain

アカウント情報を入力して[登録]ボタンを押すと。

7.ホームページ([Home]-[Index.cshtml])に戻りました。

f:id:SannomiyaNotes:20120905120749p:plain

画面右上には「Hellow User1 !」と表示されています。(user1は№6で登録したユーザー名)このユーザー名部分のリンクを押すと、パスワードの変更画面に遷移します。

f:id:SannomiyaNotes:20120905122419p:plain

 

8.この時点で「データベースエクスプローラ」を開くと

データ接続が追加されています。

f:id:SannomiyaNotes:20120905122458p:plain

テーブルは

UserProfile

webpages_Membership

webpages_OAuthMembership

webpages_Roles

webpages_UsersInRoles

の5テーブルあと、アセンブリフォルダに

Microsoft.SqlServer.Typesが追加されました。

上記の画像は、[UserProfile]と[webpages_Membership]を「テーブルデータの表示」にて表示したところです。

テーブル[UserProfile]には[UserID]と[UserName]の2カラムがあります。[UserName]は「アカウントの登録」ページで入力した内容で、[UserID]はint型で[IDENTITY]指定されていて自動的に1から連番でセットされるようになってます。

登録ページで入力したパスワードなどは、テーブル[webpages_Membership]に格納されていました。[CreateDate]には登録日時がセットされるようですが、見た感じ9時間のずれがあるので、協定世界時(UTC)が使用されているみたいです。

パスワードについては、暗号化されているのがわかります。

その他、Role関連のテーブルもあるのですが、当然この段階では空っぽです。実運用されるシステムでは当然Roleを使うケースが多いと思うのですが、その辺の情報はまた後日やってみたらということで、今日のところは先送りします。

 

さて、これらの情報がどこに作成されたのかについてですが。

「接続」のプロパティや

f:id:SannomiyaNotes:20120905134922p:plain

 「接続の変更」ダイアログ などで

f:id:SannomiyaNotes:20120905135146p:plain

 SQLServerデータベースファイルに格納されていることが確認できます。

物理ファイル(mdf,ldf)は、[App_Data]フォルダにすごく長い名前で作成されていました。

f:id:SannomiyaNotes:20120905142254p:plain

以上、標準では、

[App_Data]フォルダ下にSQLServerデータベースファイルが生成されその中のテーブルに格納されている」ということになります。

となると次の疑問は、

『オリジナルのデータベースにこれらの情報を格納するにはどうすればいいんだろう。』です。オリジナルDB内にあった方が管理しやすいと思うのです。

まずは、SQLServerのオリジナルデータベースにテーブルを作成します。

9.テーブル作成スクリプトを頂きます。

f:id:SannomiyaNotes:20120905140102p:plain

データベースエクスプローラでテーブル名をダブルクリックすると、デザイン窓とT-SQL窓が開きます。T-SQLはテーブル作成用のスクリプトです。こいつをコピーしてSQLServer Management Studio でオリジナルのDBに流し込んでテーブルを用意します

 

10.SQLServer Management Studio でオリジナルDBにテーブルを用意しました。

f:id:SannomiyaNotes:20120905141024p:plain

 

11.データベースエクスプローラで「接続の変更」を行います。

接続を選んで右クリック、「接続の変更」を選択します。

f:id:SannomiyaNotes:20120905141339p:plain

 

12.接続の変更ダイアログが表示されました。

f:id:SannomiyaNotes:20120905141604p:plain

データソースは「。。SQLServerデータベースファイル」となっています。

データソースの[変更]ボタンをクリックして

13. データソースの 変更ダイアログが表示されました。

f:id:SannomiyaNotes:20120905141656p:plain

「Microsoft SQL Server」に変更OK。

14.接続の変更ダイアログ

f:id:SannomiyaNotes:20120905141931p:plain

 オリジナルデータベースへの接続情報を入力してOK。

 

15.接続情報が変更されました。

f:id:SannomiyaNotes:20120905142048p:plain

16 .Web.configの接続文字列をオリジナルDB用に変更。

f:id:SannomiyaNotes:20120905142435p:plain

 

17 .デバッグ実行してみる。

f:id:SannomiyaNotes:20120905142931p:plain

18 .一応ちゃんと動いてる。

f:id:SannomiyaNotes:20120905143040p:plain

19 .ユーザー情報もちゃんとはいりました。

f:id:SannomiyaNotes:20120905143120p:plain

20 .SQLServer Management Studioでも確認OK

f:id:SannomiyaNotes:20120905143204p:plain

ということで、以上でオリジナルdbにテーブル移植完了です。

というものの、「DefaultConnection」って名前が気になるのでプロジェクトを検索したところ以下の3か所で使っているようです。

 

①「Web.config」の<connectionStrings> 部分(上記で変更かけたところ)

  <add name="DefaultConnection" connectionString="Data Source=...

②「Models」フォルダ内「AccountModels.cs」の

public class UsersContext : DbContext

    {

        public UsersContext()

            : base("DefaultConnection")

        {

        }

        public DbSet<UserProfile> UserProfiles { get; set; }

    }

③「Filters」フォルダ内「InitializeSimpleMembershipAttribute.cs」の

 WebSecurity.InitializeDatabaseConnection( "DefaultConnection", "UserProfile" , "UserId", "UserName", autoCreateTables: true );

以上3か所の名称は一致させとくのが吉かなと思います。

 ③の部分はデータベースを作成してる部分だと思われます。既存のDBに認証情報を格納したい場合は、私がやったように予めテーブルを作っておくよりも、上記3か所を設定しておいて、デバッグ実行すれば、指定のオリジナルDBにテーブルを作成してくれます。こっちの方が手っ取り早いかもです。

今日は以上です。誤り等ありましたら、ご指摘いただけるとたすかります。

 

-- 2013/02/14追記 --

空のデータベースを作っておいて、

Web.configの<connectionStrings>の"DefaultConnection"をそのdb向けに編集、その後ユーザー登録すると、初期化処理が動いてデフォルト形でテーブルが追加されます。最近はこの方法を使って楽してます。

あと、外部認証サービスを使う場合、SQLServerの照合順序[Japanese_90_BIN2]とかバイナリ系は注意!外部認証の削除処理でエラーになります。