Имам "Интернет приложение" - "Проект ASP.NET MVC 3 по подразбиране с контролер на акаунти, който използва удостоверяване на формуляри.", наречено MyMv3App . Стартирам сайта в IIS Express с помощта на Ctrl + F5 и след това отивам на localhost:10382/Account/Register и създавам потребител „test1“. След като потребителят бъде създаден, аз съм пренасочен към началната страница. излизам. След това отивам на localhost:10382/Account/LogOn и въвеждам потребителското име и паролата за потребителя "test1" и щраквам върху бутона "Влизане" и потребителят е влязъл. Страхотно, всичко е наред досега!
След това добавям нов проект C# „Библиотека на класове“ и го наричам MyCustomMembershipProvider. След това изтеглям ProviderToolkitSamples.msi от тук http://weblogs.asp.net/scottgu/archive/2006/04/13/442772.aspx, стартирайте инсталатора на msi и отидете в папката C:\Program Files (x86) \ASP.NET Provider Toolkit SQL Samples където се инсталират всички файлове. След това добавям тези файлове към моя проект C# Class Library MyCustomMembershipProvider, който току-що създадох, SQLMembershipProvider.cs, SecUtil.cs, SqlConnectionHelper.cs и < strong>SR.cs. (Имам нужда от всички тези файлове или проектът C# Class Library MyCustomMembershipProvider няма да се компилира). След това добавям препратка към System.configuration, System.Web и System.Web.ApplicationServices към проекта C# Class Library MyCustomMembershipProvider. След това изграждам проекта и след това отивам в MyMvc3App и добавям препратка към проекта MyCustomMembershipProvider.
Забележка: Забравих да спомена, че промених пространството от имена за всичките четири файла в проекта MyCustomMembershipProvider на "пространство от имена MyCustomMembershipProvider" и също така преименувах името на класа на 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“ и щраквам върху бутона „Влизане“ и получавам съобщение за грешка:
Влизането беше неуспешно. Моля, коригирайте грешките и опитайте отново. Предоставеното потребителско име или парола са неправилни.
Защо? Какво пропуснах? Не съм пипал нищо освен пространството от имена и тази променлива name в SQLMembershipProvider.cs в ред 110.
Опитах се да разбера защо, така че потърсих в Google и открих, че добавянето на елемента machineKey може да работи. Така че отидох на този сайт http://www.developmentnow.com/articles/machinekey_generator.aspx и генерира ASP.NET 2.0 machineKey и го копира, постави в елемента system.web на web.config:
<machineKey
validationKey="A5E72C3BF96D34B9401278890361AA0949EAE806B124573AC3C1A8D77936B4E42BB1374D1DA443706C4E575B7F1234CB48F4CF52444CB4B1F343994752416569"
decryptionKey="47869B2D1F1D3EBC92FCC4C2D7B0EFB707535925E116AEF85F470E138A6C8CB5"
validation="SHA1" decryption="AES"
/>
Още веднъж направих абсолютно същото нещо като преди; Отивам на localhost:10382/Account/Register и създавам потребител, този път наричам потребителя „test3“. След като потребителят бъде създаден, аз съм пренасочен към началната страница. излизам. След това отивам на localhost:10382/Account/LogOn и въвеждам потребителското име и паролата за потребителя "test3" и щраквам върху бутона "Вход" и BAM! потребителят отново е влязъл!?
Защо трябваше ръчно да конфигурирам machineKey с генериран validationKey и decryptionKey в web.config, за да може MyCustomMembershipProvider да работи със страницата за вход? Доколкото видях, няма нито една статия/страница/блог, която да говори за добавяне на елемент machineKey към вашия web.config, за да може вашият потребителски доставчик на членство да работи!
АКТУАЛИЗАЦИЯ 1: Добавянето на hashAlgorithmType="SHA1" също работи:
<membership defaultProvider="MyCustomMembershipProvider" hashAlgorithmType="SHA1">
Странно обаче е, че MSDN казва, че SHA1 е по подразбиране!?
hashAlgorithmType Незадължителен низов атрибут. Указва името на алгоритъма за криптиране, който се използва за хеширане на стойностите на паролата. Стойността на този атрибут съответства на атрибута name на елемент nameEntry в раздела за конфигуриране на cryptoNameMapping. За информация относно определянето на персонализиран алгоритъм за хеширане вижте Съпоставяне на имена на алгоритъм към криптографски класове. По подразбиране е SHA1.
АКТУАЛИЗАЦИЯ 2: След като прочетох за най-новите технологии на Microsoft, реших да споделя някои от констатациите, които открих относно техния най-нов доставчик на членство; SimpleMembership. Аз съм на етап в моя личен проект, когато реших да премахна CustomMembershipProvider от ASP.NET 2.0 дни, които създадох, и вместо това да използвам SimpleMembership доставчик. Защо? Ами имате цялата информация, която някога ще искате да знаете, в следната публикация в блога на Джон Галоуей. Също така добавям още няколко връзки към ресурси, които си струва да разгледате. Според Microsoft SimpleMembership е наследник на ASP.NET 2.0 Membership.
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