به طور پیش فرض نشانه connectionStringName از تهیه کننده SqlMembershipProvider (AspNetSqlMembershipProvider) با مقدار LocalSqlServer مقداردهی شده است. همانند AspNetSqlMembershipProvider مقدار LocalSqlServer نیز در machine.config مشخص شده است.
<connectionStrings>
<add name="LocalSqlServer" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
همانطور که میبینید، این رشته اتصال بانک اطلاعاتی را از نسخه SQL 2005 Express Edition در مسیر “|DataDirectory| aspnetdb.mdf” مشخص کرده است. رشته “|DataDirectory|” به پوشه App_Data در مسیر پروژه اطلاق می شود. اگر اطلاعات تهیه کننده عضویت در داخل فایل Web.config مشخص نشود، برنامه از تهیه کننده ثبت شده پیش فرض، AspNetSqlMembershipProvider، استفاده میکند. اگر فایل aspnetdb.mdf در پوشه App_Data وجود نداشته باشد، برنامه به طور خودکار آن را ایجاد میکند. به هر حال ما از aspnetdb.mdf استفاده نمیکنیم، بلکه از SecurityTutorials.mdf که در گام دوم ایجاد کردیم، استفاده میکنیم.
قبل از اینکه بتوانیم یک تهیه کننده ثبت کنیم که به بانک اطلاعاتی SecurityTutorials.mdf نسبت داده شود، باید یک رشته اتصال مناسب در بخش <connectionString> در فایل Web.config اضافه کنیم. کدهای زیر یک رشته اتصال جدید به نام SecurityTutorialsConnectionString که به فایل SecurityTutorials.mdf از نسخه SQL 2005 Express Edition در داخل پوشه App_Data ارجاع دارد، ایجاد میکند.
<configuration>
<connectionStrings>
<add name="SecurityTutorialsConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SecurityTutorials.mdf;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
... Configuration markup removed for brevity ...
</system.web>
</configuration>
کدهای زیر را به فایل Web.config اضافه کنید. این کدها یک تهیه کننده جدید به نام SecurityTutorialsSqlMembershipProvider ایجاد میکند:
<configuration>
<connectionStrings>
<add name="SecurityTutorialsConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SecurityTutorials.mdf;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
<membership defaultProvider="SecurityTutorialsSqlMembershipProvider">
<providers>
<!-- Add a customized SqlMembershipProvider -->
<add name="SecurityTutorialsSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="SecurityTutorialsConnectionString"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="SecurityTutorials"
requiresUniqueEmail="true"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""/>
</providers>
</membership>
... Configuration markup removed for brevity ...
</system.web>
</configuration>
افزون بر ثبت تهیه کننده SecurityTutorialsSqlMembershipProvider، کدهای بالا SecurityTutorialsSqlMembershipProvider را به عنوان تهیه کننده پیش فرض تعیین میکنند.
در حال حاضر برنامه ما دو تهیه کننده ثبت شده دارد: AspNetSqlMembershipProvider و SecurityTutorialsSqlMembershipProvider. میتوان قبل از ثبت SecurityTutorialsSqlMembershipProvider تمام تهیه کنندگان ثبت شده قبلی را حذف کرد، کافی است عنصر <clear/> را قبل از عنصر <add> قرار دهیم. این کار باعث حذف AspNetSqlMembershipProvider از لیست تهیه کنندگان میشود و معنی آن این است که تهیه کننده SecurityTutorialsSqlMembershipProvider تنها تهیه کننده عضویت ثبت شده است. در صورت انجام این کار دیگر نیاز نیست که SecurityTutorialsSqlMembershipProvider را به عنوان تهیه کننده پیش فرض معرفی کنیم.
تمام بسترهایی که مدل تهیه کننده را پشتیبانی میکنند، مانند بسترهای عضویت و نقش ها، در انجام جزییات کمبود دارند ولی در عوض با استفاده از کلاس تهیه کننده میتوان کمبودها را برطرف کرد. در مورد بستر عضویت، کلاس Membership یک رابط برای مدیریت حسابهای کاربران تعیین کرده است، اما به طور مستقیم روی هیچ کدام از محل های نگهداری کاربران اثر متقابل ندارد. بلکه متدهای کلاس Membership درخواست پیکربندی تهیه کننده را کنار میزنند. ما از SqlMembershipProvider استفاده میکنیم. وقتی که ما فراخوانی می کنیم یک متد در کلاس Membership بستر عضویت چگونه متوجه میشود که باید فرمان را به SqlMembershipProvider ارجاع دهد؟
کلاس Membership یک مشخصه به نام provider دارد که یک ارجاع به تمام کلاسهای در دسترس تهیه کنندگان ثبت شده برای استفاده بستر عضویت دارد. هر تهیه کننده ثبت شده ترکیبی از نام و نوع دارد. نام تهیه کننده، یک روش انسان پسند برای ارجاع به یک تهیه کننده خاص در مجموعه Providers است حال آنکه نوع، کلاس تهیه کننده را مشخص میکند. افزون بر آن، هر تهیه کننده ثبت شده، باید دارای تنظیمات پیکربندی باشد. تنظیمات پیکربندی برای بستر عضویت شامل passwordFormat و requiresUniqueEmail و چیزهای دیگر میشود.
جدول زیر تمام تنظیمات پیکربندی که توسط SqlMembershipProvider استفاده میشود را نشان میدهد:
مفاد مشخصه Providers از طریق تنظیمات پیکربندی برنامه کاربردی تعیین می شوند. به طور پیش فرض، تمام برنامهها یک تهیه کننده به نام AspNetSqlMembershipProvider از نوع SqlMembershipProvider دارند. این تهیه کننده عضویت به طور پیش فرض در machine.config ثبت شده است.
<membership>
<providers>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""/>
</providers>
</membership>
همانگونه که در بالا نشان داده شد، عنصر <membership> تنظیمات پیکربندی برای بستر عضویت را تعیین میکند در حالی که عنصر فرزند <providers> تهیه کنندگان ثبت شده را مشخص میکند. تهیه کنندگان ممکن است با استفاد از عناصر <add> و یا <remove> اضافه و یا حذف شوند؛ با استفاده از عنصر <clear> تمام تهیه کنندگان ثبت شده را میتوان حذف کرد.
بستر نقش ها به توسعه دهندگان اجازه می دهد تا تعدادی نقش مشخص کرده و تعیین کننده که کدام کاربر به کدام نقش مرتبط است. این اطلاعات در بانک اطلاعاتی در دو جدول نگهداری میشود: aspnet_Roles و aspnet_UsersInRoles. هر رکورد در جدول aspnet_Roles مشخص کننده یک نقش برای یک برنامه ویژه است. همانند جدول aspnet_Users در جدول aspnet_Roles نیز سه ستون با بحث ما مرتبط هستند:
· RoleId
· RoleName
· ApplicationId
RoleId کلید اصلی است و نوع آن uniqueidentifier است. RoleName از نوع nvarchar(256) است. ApplicationId حساب کاربری را به یک برنامه خاص در جدول aspnet_Applications مرتبط میکند.
جدول aspnet_UsersInRoles ارتباط بین کاربران و نقش ها را مشخص میکند. این جدول فقط دو ستون UserId و RoleId دارد و ترکیب هر دو کلید اصلی را میسازد.