[ASP.NET] 利用 MembershipProvider 實現 SQL + AD 混合驗証

[ASP.NET] 利用 MembershipProvider 實現 SQL + AD 混合驗証

我有一個 SQL 及 AD 混合驗証的需求,應用程式沒有建立 AD 使用者的權限,只需要用 AD 來驗証;應用程式能在建立新的非 AD 用戶帳號並存放在 SQL

面對這樣的需求,除了自己硬幹之外,還可以利用 MembershipProvider 來實作,可以省掉不少程式碼,主要是資料來源處理

MembershipProvider 是抽像類別,BCL 已經實作了以下類別,如下圖:

image

 

當然,若有不同的資料來源可自行實作 MembershipProvider,這裡不介紹如何實作

本篇要利用 SqlMembershipProvider + ActiveDirectoryMembershipProvider 來完成混合驗証

使用 SqlMembership

使用 ActiveDirectoryMembershipProvider

完整設定檔

合體測試


使用 SqlMembership

相關命令參數請參考,下圖

http://msdn.microsoft.com/zh-tw/library/ms229862.aspx

image

 

調用 aspnet_regsql.exe -S . -E -A m

aspnet_regsql.exe 操作方式可參考上篇 http://www.dotblogs.com.tw/yc421206/archive/2014/05/13/145076.aspx

image

 

命令完成後會資料庫建立,

image

 

 

 

SqlMembershipProvider 被加入到 Membership.Providers 集合裡

PS.不知道MySQL怎麼來的

image

 

 

不過只有這樣還不能用,還要設定 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() 方法,這裡的密碼有複雜度的處理

image

 

使用 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

Image result for microsoft+mvp+logo