У меня есть " Интернет-приложение " - " Проект ASP.NET MVC 3 по умолчанию с контроллером учетных записей, который использует аутентификацию форм. " называется MyMv3App ,Я запускаю сайт в IIS Express , используя Ctrl + F5, а затем захожу на localhost: 10382 / Account / Register и создаю пользователя " test1 ".Как только пользователь создан, я перенаправлен на домашнюю страницу.Я выхожуЗатем я захожу на localhost: 10382 / Account / LogOn и набираю имя пользователя и пароль для пользователя «test1» и нажимаю кнопку «Log On», и пользователь входит в систему. Круто, пока все в порядке!
Затем я добавляю новый C #" Библиотека классов " проект и называю его MyCustomMembershipProvider .Затем я загружаю ProviderToolkitSamples.msi отсюда http://weblogs.asp.net/scottgu/archive/2006/04/13/442772.aspx,, запускаю установщик msi и захожу в папку C: \ Program Files (x86) \ Примеры SQL инструментария провайдера ASP.NET где все файлы установлены.Затем я добавляю эти файлы в свой проект библиотеки классов C # MyCustomMembershipProvider, который я только что создал, SQLMembershipProvider.cs , SecUtil.cs , SqlConnectionHelper.cs и SR.cs .(Мне нужны все эти файлы, иначе проект библиотеки классов C # MyCustomMembershipProvider не будет компилироваться).Затем я добавляю ссылку на System.configuration , System.Web и System.Web.ApplicationServices в проект библиотеки классов C # MyCustomMembershipProvider.Затем я создаю проект и затем перехожу к MyMvc3App и добавляю ссылку на проект MyCustomMembershipProvider.
Примечание. Забыл упомянуть, что я изменил пространство имен для всех четырех файлов в проекте MyCustomMembershipProvider на «пространство имен MyCustomMembershipProvider»а также я переименовал имя класса в MyCustomMembershipProvider.А также в строке 110 SQLMembershipProvider.cs я изменил его с 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>
Весь веб.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.
Я попытался понять, почему, поэтому я погуглил и обнаружил, что добавление элемента machineKey может работать,Поэтому я зашел на этот сайт http://www.developmentnow.com/articles/machinekey_generator.aspx и сгенерировал машинный ключ ASP.NET 2.0 и скопировал его в элемент 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 Необязательный атрибут String.Задает имя алгоритма шифрования, который используется для хэширования значений пароля.Значение этого атрибута соответствует атрибуту name элемента nameEntry в разделе конфигурации cryptoNameMapping.Информацию об указании пользовательского алгоритма хеширования см. В разделе Отображение имен алгоритмов в классы криптографии. По умолчанию SHA1 .
ОБНОВЛЕНИЕ 2 : после ознакомления с новейшими технологиями Microsoft я решил поделиться некоторыми обнаруженными мной выводами относительно их последнего провайдера Mebership;SimpleMembership.Я нахожусь на этапе моего личного проекта, где я решил удалить CustomMembershipProvider из ASP.NET 2.0 дней, которые я создал, и вместо этого использовать провайдера SimpleMembership.Зачем?Ну, у вас есть вся информация, которую вы когда-либо захотите узнать в следующем посте Джона Галлоуэя.Я также добавляю еще несколько ссылок на ресурсы, которые стоит проверить.Согласно Microsoft SimpleMembership является преемником членства ASP.NET 2.0.
http://weblogs.asp.net/jgalloway/archive/2012/08/29/simplemembership-membership-providers-universal-providers-and-the-new-asp-net-4-5-web-forms-and-asp-net-mvc-4-templates.aspx
http://mvccentral.net/Story/Details/tools/kahanu/securityguard-nuget-package-for-asp-net-membership
http://blog.longle.net/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom-user-properties/
http://blog.osbornm.com/archive/2010/07/21/using-simplemembership-with-asp.net-webpages.aspx
http://blogs.msdn.com/b/rickandy/archive/2012/08/15/initializesimplemembership-attribute-and-simplemembership-exceptions.aspx