[ASP.NET] 利用 MembershipProvider 實現 SQL + AD 混合驗証
我有一個 SQL 及 AD 混合驗証的需求,應用程式沒有建立 AD 使用者的權限,只需要用 AD 來驗証;應用程式能在建立新的非 AD 用戶帳號並存放在 SQL
面對這樣的需求,除了自己硬幹之外,還可以利用 MembershipProvider 來實作,可以省掉不少程式碼,主要是資料來源處理
MembershipProvider 是抽像類別,BCL 已經實作了以下類別,如下圖:
當然,若有不同的資料來源可自行實作 MembershipProvider,這裡不介紹如何實作
本篇要利用 SqlMembershipProvider + ActiveDirectoryMembershipProvider 來完成混合驗証
使用 ActiveDirectoryMembershipProvider
完整設定檔
相關命令參數請參考,下圖
http://msdn.microsoft.com/zh-tw/library/ms229862.aspx
調用 aspnet_regsql.exe -S . -E -A m
aspnet_regsql.exe 操作方式可參考上篇 http://www.dotblogs.com.tw/yc421206/archive/2014/05/13/145076.aspx
命令完成後會資料庫建立,
SqlMembershipProvider 被加入到 Membership.Providers 集合裡
PS.不知道MySQL怎麼來的
不過只有這樣還不能用,還要設定 membership 組態檔跟 SQL 連線字串
<connectionStrings> <add name="SqlConnect" connectionString="Data Source=.;Initial Catalog=aspnetdb;User ID=your id;Password=your password" /> </connectionStrings> <membership defaultProvider="SQLProvider" userIsOnlineTimeWindow="15"> <providers> <add name="SQLProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="SqlConnect" applicationName="MyApplication" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" passwordAttemptWindow="10" /> </providers> </membership>
測試一下
基本上就是調用 Membership.CreateUser() 方法,這裡的密碼有複雜度的處理
使用 ActiveDirectoryMembershipProvider
開始前要先安裝 AD,安裝步驟可參考以下
http://www.dotblogs.com.tw/yc421206/archive/2011/06/23/29639.aspx
http://www.dotblogs.com.tw/yc421206/archive/2013/07/26/112538.aspx
設定組態檔
在原本的設定檔加入以下設定,這裡會使用到 LDAP 語法
<add name="ADConnect" connectionString="LDAP://demo.local/CN=Users,dc=demo,dc=local" /> <add name="ADProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" connectionStringName="ADConnect" applicationName="MyApplication" attributeMapUsername="sAMAccountName" connectionUsername="demo\your account" connectionPassword="password" enableSearchMethods="true" />
<?xml version="1.0" encoding="utf-8"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <connectionStrings> <add name="SqlConnect" connectionString="Data Source=.;Initial Catalog=aspnetdb;User ID=your id;Password=your password" /> <add name="ADConnect" connectionString="LDAP://demo.local/CN=Users,dc=demo,dc=local" /> </connectionStrings> <system.web> <authentication mode="Forms"> </authentication> <compilation debug="true" targetFramework="4.5.1" /> <httpRuntime targetFramework="4.5.1" /> <membership defaultProvider="SQLProvider" userIsOnlineTimeWindow="15"> <providers> <clear /> <add name="SQLProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="SqlConnect" applicationName="MyApplication" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" passwordAttemptWindow="10" /> <add name="ADProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" connectionStringName="ADConnect" applicationName="MyApplication" attributeMapUsername="sAMAccountName" connectionUsername="demo\your account" connectionPassword="your password" enableSearchMethods="true" /> </providers> </membership> </system.web> </configuration>
protected void Page_Load(object sender, EventArgs e) { var providers = Membership.Providers; if (providers == null) { } var account = "ad account"; var password = "ad password"; bool isValidated = false; if (Membership.ValidateUser(account, password)) { isValidated = true; } else { if (Membership.Providers["ADProvider"].ValidateUser(account, password)) { isValidated = true; } } if (isValidated) { FormsAuthentication.SetAuthCookie(account, false); } }
只要短短的程式碼就能完成混合驗証,若要介接到別的資料庫,理當是辦的到吧,下次再來測試看看
本文出自:http://www.dotblogs.com.tw/yc421206/archive/2014/05/13/145086.aspx
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET