[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