「インターネットアプリケーション」-「フォーム認証を使用するアカウントコントローラーを備えたデフォルトのASP.NETMVC3プロジェクト」があります。 「 MyMv3App」と呼ばれます。Ctrl +F5を使用してIISExpressでサイトを実行してから、localhost:10382 / Account / Registerに移動し、ユーザー「test1」を作成します。ユーザーが作成されると、ホームページにリダイレクトされます。ログオフします。次に、localhost:10382 / Account / LogOnに移動し、ユーザー「test1」のユーザー名とパスワードを入力して「ログオン」ボタンをクリックすると、ユーザーがログインします。これまでのところ、すべてOKです。
次に、新しいC#「クラスライブラリ」プロジェクトを追加し、 MyCustomMembershipProviderという名前を付けます。次に、ここhttp://weblogs.asp.net/scottgu/archive/2006/04/13/442772.aspxからProviderToolkitSamples.msiをダウンロードし、msiインストーラーを実行して、C:\ Program Files(x86)フォルダーに移動します。 )\ ASP.NET ProviderToolkitSQLサンプル。すべてのファイルがインストールされます。次に、これらのファイルを、作成したC#クラスライブラリプロジェクトMyCustomMembershipProvider、SQLMembershipProvider.cs、SecUtil.cs、SqlConnectionHelper.cs、およびSR.csに追加します。。(これらすべてのファイルが必要です。そうしないと、C#クラスライブラリプロジェクトのMyCustomMembershipProviderがコンパイルされません)。次に、System.configuration、System.Web、およびSystem.Web.ApplicationServicesへの参照をC#クラスライブラリプロジェクトMyCustomMembershipProviderに追加します。次に、プロジェクトをビルドしてから、MyMvc3Appに移動し、MyCustomMembershipProviderプロジェクトへの参照を追加します。
注:プロジェクトMyCustomMembershipProviderの4つのファイルすべての名前空間を「namespaceMyCustomMembershipProvider」に変更し、クラス名の名前をMyCustomMembershipProviderに変更したことを忘れてしまいました。また、SQLMembershipProvider.csの110行目で、name="SqlMembershipProvider";から変更しました。to name = "MyCustomMembershipProvider";
次に、web.configファイルのメンバーシップセクションを次のように変更します。
<membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
applicationName="/" />
</providers>
</membership>
これに:
<membership defaultProvider="MyCustomMembershipProvider">
<providers>
<clear/>
<add name="MyCustomMembershipProvider" type="MyCustomMembershipProvider.MyCustomMembershipProvider" connectionStringName="ApplicationServices"
enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
applicationName="/" />
</providers>
</membership>
web.config全体は次のようになります。
<?xml version="1.0"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=152368
-->
<configuration>
<connectionStrings>
<add name="ApplicationServices"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
<add key="webpages:Version" value="1.0.0.0"/>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
</compilation>
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication>
<membership defaultProvider="MyCustomMembershipProvider">
<providers>
<clear/>
<add name="MyCustomMembershipProvider" type="MyCustomMembershipProvider.MyCustomMembershipProvider" connectionStringName="ApplicationServices"
enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
applicationName="/" />
</providers>
</membership>
<profile>
<providers>
<clear/>
<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" />
</providers>
</profile>
<roleManager enabled="false">
<providers>
<clear/>
<add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
<add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
</providers>
</roleManager>
<pages>
<namespaces>
<add namespace="System.Web.Helpers" />
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages"/>
</namespaces>
</pages>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
今、私は最初の段落で行ったのとまったく同じことをします。localhost:10382 / Account / Registerに移動してユーザーを作成します。今回は、ユーザーを「test2」と呼びます。ユーザーが作成されると、ホームページにリダイレクトされます。ログオフします。次に、localhost:10382 / Account / LogOnに移動して再度ログインし、ユーザー「 test2 」のユーザー名とパスワードを入力して「ログオン」ボタンをクリックすると、エラーメッセージが表示されます。
ログインに失敗しました。エラーを修正して、再試行してください。提供されたユーザー名またはパスワードが正しくありません。
なんで?私は何を取りこぼしたか?110行目のSQLMembershipProvider.csの名前空間とその名前変数以外には何も触れていません。
理由を理解しようとしたので、グーグルで調べて、machineKey要素を追加すると機能する可能性があることがわかりました。そこで、このサイトhttp://www.developmentnow.com/articles/machinekey_generator.aspxにアクセスし、ASP.NET 2.0 machineKeyを生成して、web.configのsystem.web要素にコピーして貼り付けました。
<machineKey
validationKey="A5E72C3BF96D34B9401278890361AA0949EAE806B124573AC3C1A8D77936B4E42BB1374D1DA443706C4E575B7F1234CB48F4CF52444CB4B1F343994752416569"
decryptionKey="47869B2D1F1D3EBC92FCC4C2D7B0EFB707535925E116AEF85F470E138A6C8CB5"
validation="SHA1" decryption="AES"
/>
私はもう一度、以前とまったく同じことをしました。localhost:10382 / Account / Registerに移動してユーザーを作成します。今回は、ユーザーを「test3 」と呼んでいます。ユーザーが作成されると、ホームページにリダイレクトされます。ログオフします。次に、localhost:10382 / Account / LogOnに移動し、ユーザー「 test3 」のユーザー名とパスワードを入力して、「ログオン」ボタンとBAMをクリックします。ユーザーは再びログインしています!?
MyCustomMembershipProviderがログインページで機能できるようにするには、web.configで生成されたvalidationKeyとdecryptionKeyを使用してmachineKeyを手動で構成する必要があるのはなぜですか?私が見た限りでは、カスタムメンバーシッププロバイダーが機能できるようにweb.configにmachineKey要素を追加することについて説明している記事/ページ/ブログは1つもありません。
更新1:hashAlgorithmType = "SHA1"の追加も同様に機能します:
<membership defaultProvider="MyCustomMembershipProvider" hashAlgorithmType="SHA1">
面白いことに、MSDNはSHA1がデフォルトだと言っています!?
hashAlgorithmTypeオプションの文字列属性。パスワード値のハッシュに使用される暗号化アルゴリズムの名前を指定します。この属性の値は、cryptoNameMapping構成セクションのnameEntry要素のname属性に対応します。カスタムハッシュアルゴリズムの指定については、アルゴリズム名の暗号化クラスへのマッピングを参照してください。 デフォルトはSHA1です。
更新2:Microsoftの最新テクノロジを読んだ後、最新のMebershipプロバイダーに関して発見した調査結果のいくつかを共有することにしました。SimpleMembership。私は個人的なプロジェクトの段階にあり、代わりにSimpleMembershipプロバイダーを構築して使用したASP.NET2.0日からCustomMembershipProviderを削除することにしました。なんで?さて、あなたはジョン・ギャロウェイによる次のブログ投稿であなたが知りたいと思うであろうすべての情報を持っています。また、チェックする価値のあるリソースへのリンクをいくつか追加しています。Microsoftによると、SimpleMembershipはASP.NET2.0メンバーシップの後継です。
http://mvccentral.net/Story/Details/tools/kahanu/securityguard-nuget-package-for-asp-net-membership
http://blog.osbornm.com/archive/2010/07/21/using-simplemembership-with-asp.net-webpages.aspx