كيفية مصادقة مقابل "Active Directory" باستخدام مصادقة النماذج و Visual Basic.NET

ملخص

توضح هذه المقالة خطوة بخطوة كيفية استخدام أحد تطبيقات ASP.NET مصادقة النماذج للسماح للمستخدمين بالمصادقة مقابل "Active Directory" باستخدام بروتوكول الوصول الخفيف لتغيير بيانات الدليل (LDAP).

بعد مصادقة المستخدم وإعادة توجيهها، يمكنك استخدام أسلوب Application_AuthenticateRequest لملف Global.asax لتخزين كائن GenericPrincipal في HttpContext.User الخاصية تنساب خلال الطلب.

إنشاء تطبيق ويب ASP.NET في Visual Basic.NET

اتبع الخطوات لإنشاء تطبيق ويب ASP.NET جديد يسمى فورمسوثاد في Visual Basic.NET التالية:
  1. Microsoft Visual Studio.NET.بدء تشغيل
  2. من القائمة ملف، أشر إلى جديد ثم انقر فوق المشروع.
  3. انقر فوق مشاريع Visual Basic ضمن أنواع المشاريع، ومن ثم انقر فوق تطبيق ويب ASP.NET ضمن قوالب.
  4. في المربع الموقع ، اكتب http://<servername>/FormsAuthAd (استبدال http://localhost إذا كنت تستخدم الملقم المحلي (حيث يكون http://localhost/FormsAuthAdومن ثم انقر فوق موافق.
  5. زر الماوس الأيمن فوق العقدة المراجع في "مستكشف الحلول" ومن ثم انقر فوق إضافة مرجع.
  6. ضمن علامة التبويب .NET في مربع الحوار إضافة المرجع ، انقر فوق System.DirectoryServices.dllانقر فوق تحديدومن ثم انقر فوق موافق.

كتابة رمز المصادقة

اتبع هذه الخطوات لإنشاء ملف فئة جديد يسمى LdapAuthentication.vb:
  1. في "مستكشف الحلول"، انقر نقراً مزدوجاً فوق عقده المشروع أشر إلى إضافةوثم انقر فوق إضافة عنصر جديد.
  2. انقر فوق فئة ضمن قوالب.
  3. اكتب LdapAuthentication.vb في مربع الاسم ، ومن ثم انقر فوق فتح.
  4. استبدال التعليمات البرمجية الموجودة في الملف LdapAuthentication.vb باستخدام التعليمات البرمجية التالية:
    Imports SystemImports System.Text
    Imports System.Collections
    Imports System.DirectoryServices

    Namespace FormsAuth
    Public Class LdapAuthentication

    Dim _path As String
    Dim _filterAttribute As String

    Public Sub New(ByVal path As String)
    _path = path
    End Sub

    Public Function IsAuthenticated(ByVal domain As String, ByVal username As String, ByVal pwd As String) As Boolean

    Dim domainAndUsername As String = domain & "\" & username
    Dim entry As DirectoryEntry = New DirectoryEntry(_path, domainAndUsername, pwd)

    Try
    'Bind to the native AdsObject to force authentication.
    Dim obj As Object = entry.NativeObject
    Dim search As DirectorySearcher = New DirectorySearcher(entry)

    search.Filter = "(SAMAccountName=" & username & ")"
    search.PropertiesToLoad.Add("cn")
    Dim result As SearchResult = search.FindOne()

    If (result Is Nothing) Then
    Return False
    End If

    'Update the new path to the user in the directory.
    _path = result.Path
    _filterAttribute = CType(result.Properties("cn")(0), String)

    Catch ex As Exception
    Throw New Exception("Error authenticating user. " & ex.Message)
    End Try

    Return True
    End Function

    Public Function GetGroups() As String
    Dim search As DirectorySearcher = New DirectorySearcher(_path)
    search.Filter = "(cn=" & _filterAttribute & ")"
    search.PropertiesToLoad.Add("memberOf")
    Dim groupNames As StringBuilder = New StringBuilder()

    Try
    Dim result As SearchResult = search.FindOne()
    Dim propertyCount As Integer = result.Properties("memberOf").Count

    Dim dn As String
    Dim equalsIndex, commaIndex

    Dim propertyCounter As Integer

    For propertyCounter = 0 To propertyCount - 1
    dn = CType(result.Properties("memberOf")(propertyCounter), String)

    equalsIndex = dn.IndexOf("=", 1)
    commaIndex = dn.IndexOf(",", 1)
    If (equalsIndex = -1) Then
    Return Nothing
    End If

    groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1))
    groupNames.Append("|")
    Next

    Catch ex As Exception
    Throw New Exception("Error obtaining group names. " & ex.Message)
    End Try

    Return groupNames.ToString()
    End Function
    End Class
    End Namespace



توضيح لرمز

يقبل رمز مصادقة مجال واسم مستخدم، وكلمة مرور ومسار إلى الشجرة في "Active Directory". يستخدم هذا الرمز الموفر دليل LDAP.
مصادقة المستخدم
التعليمات البرمجية في الصفحة Logon.aspx استدعاء الأسلوب LdapAuthentication.IsAuthenticated ويقوم بتمرير بيانات اعتماد التي تم تجميعها من المستخدم. ثم يتم إنشاء كائن DirectoryEntry المسار إلى شجرة الدليل واسم المستخدم وكلمة المرور. يجب أن يكون اسم المستخدم في تنسيق "المجال/اسم المستخدم". ثم يحاول كائن DirectoryEntry فرض ربط أدسوبجيكت عن طريق الحصول على خاصية ناتيفيوبجيكت . في حال نجاح ذلك، يتم الحصول على سمة CN للمستخدم عن طريق إنشاء كائن ديريكتوريسيرتشير والتصفية على SAMAccountName. بعد أن تتم المصادقة على المستخدم، إيسوثينتيكاتيد الأسلوب بإرجاع true.

ملاحظة: عند استخدام LDAP لربط كائن مرتبطة ب "Active Directory"، يتم استخدام منافذ TCP. زيادة استخدام ldap بالمقابلة مع مساحة الاسم System.DirectoryServices استخدام كافة منافذ TCP المتوفرة. قد تتمكن من تقليل تحميل TCP إعادة استخدام الاتصال الذي قمت باستخدامه لمصادقة المستخدم.
مجموعات المستخدمين
للحصول على قائمة بالمجموعات التي ينتمي إليها المستخدم، هذه التعليمات البرمجية باستدعاء الأسلوب LdapAuthentication.GetGroups . أسلوب LdapAuthentication.GetGroups تحصل على قائمة بمجموعات الأمان والتوزيع التي ينتمي إليها المستخدم عن طريق إنشاء كائن ديريكتوريسيرتشير والتصفية حسب السمة عضو . هذا الأسلوب بإرجاع قائمة مجموعات مفصولة بتوجيهات الإخراج (|).

لاحظ أن الأسلوب LdapAuthentication.GetGroups تعالج واقتطاع سلاسل. وهذا يقلل طول السلسلة التي يتم تخزينها في ملف تعريف ارتباط المصادقة. إذا لم يتم اقتطاع السلسلة، تنسيق كل مجموعة تظهر كما يلي:
CN=...,...,DC=domain,DC=com
يؤدي هذا إلى إنشاء سلسلة طويلة جداً. إذا كان طول هذه السلسلة أكبر من طول ملف تعريف الارتباط، قد لا يتم إنشاء ملف تعريف ارتباط المصادقة. هذه السلسلة قد تكون أكبر من طول ملف تعريف الارتباط، قد تحتاج إلى تخزين معلومات المجموعة في كائن ذاكرة التخزين المؤقت في ASP.NET أو في قاعدة بيانات. بدلاً من ذلك، قد تحتاج إلى تشفير المعلومات المجموعة وتخزين هذه المعلومات في حقل نموذج مخفي.

كتابة التعليمات البرمجية Global.asax

التعليمات البرمجية في ملف Global.asax يوفر معالج حدث Application_AuthenticateRequest . معالج الحدث هذا استرداد ملف تعريف ارتباط المصادقة من مجموعة Context.Request.Cookies ويقوم بفك تشفير ملف تعريف الارتباط واسترداد قائمة الجماعات التي سيتم تخزينها في الخاصية FormsAuthenticationTicket.UserData . تظهر المجموعات في قائمة مفصولة بتوجيه الإخراج الذي تم إنشاؤه في الصفحة Logon.aspx.

الرمز يفسر السلسلة في صفيف سلسلة لإنشاء كائن GenericPrincipal . بعد إنشاء الكائن GenericPrincipal ، يتم وضع هذا الكائن في خاصية HttpContext.User .
  1. في "مستكشف الحلول"، انقر بالزر الأيمن Global.asax، وثم انقر فوق عرض التعليمات البرمجية.
  2. أضف التعليمات البرمجية التالية في الجزء العلوي من التعليمات البرمجية خلف الملف Global.asax.vb:
    Imports System.Web.SecurityImports System.Security.Principal

  3. استبدال معالج حدث فارغ موجود ل Application_AuthenticateRequest مع التعليمات البرمجية التالية:
    Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)        ' Fires upon attempting to authenticate the use
    Dim cookieName As String = FormsAuthentication.FormsCookieName
    Dim authCookie As HttpCookie = Context.Request.Cookies(cookieName)

    If (authCookie Is Nothing) Then
    'There is no authentication cookie.
    Return
    End If

    Dim authTicket As FormsAuthenticationTicket = Nothing

    Try
    authTicket = FormsAuthentication.Decrypt(authCookie.Value)
    Catch ex As Exception
    'Write the exception to the Event Log.
    Return
    End Try

    If (authTicket Is Nothing) Then
    'Cookie failed to decrypt.
    Return
    End If

    'When the ticket was created, the UserData property was assigned a
    'pipe-delimited string of group names.
    Dim groups As String() = authTicket.UserData.Split(New Char() {"|"})

    'Create an Identity.
    Dim id As GenericIdentity = New GenericIdentity(authTicket.Name, "LdapAuthentication")

    'This principal flows throughout the request.
    Dim principal As GenericPrincipal = New GenericPrincipal(id, groups)

    Context.User = principal

    End Sub

تعديل ملف Web.config

في هذا المقطع، يمكنك تكوين
نماذج
المصادقة، و
عناصر التخويل في ملف Web.config. وبهذه التغييرات، يمكن المستخدمين المصادق عليهم فقط من الوصول إلى التطبيق، وتتم إعادة توجيه طلبات غير مصادقة إلى صفحة Logon.aspx. يمكنك تعديل هذا التكوين للسماح لبعض المستخدمين والمجموعات في الوصول إلى التطبيق فقط.

استبدال التعليمات البرمجية الموجودة في الملف Web.config باستخدام التعليمات البرمجية التالية:
<?xml version="1.0" encoding="utf-8" ?><configuration>    
<system.web>
<authentication mode="Forms">
<forms loginUrl="logon.aspx" name="adAuthCookie" timeout="60" path="/" >
</forms>
</authentication>
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
<identity impersonate="true" />
</system.web>
</configuration>

لاحظ انتحال هوية = "true"/ عنصر التكوين. يؤدي ASP.NET لانتحال الحساب الذي تم تكوينه كحساب مجهول من خدمات معلومات إنترنت (IIS) ل Microsoft. نتيجة هذا التكوين، تشغيل كافة طلبات إلى هذا التطبيق ضمن سياق الأمان للحساب الذي تم تكوينه. المستخدم توفير بيانات الاعتماد لمصادقة مقابل "Active Directory"، ولكن حساب يمكنه الوصول إلى Active Directory هو الحساب الذي تم تكوينه. لمزيد من المعلومات، راجع قسم المراجع .

تكوين IIS للمصادقة المجهولة

لتكوين IIS للمصادقة المجهولة، اتبع الخطوات التالية:
  1. في وحدة تحكم إدارة خدمات معلومات إنترنت (IIS)، انقر نقراً مزدوجاً فوق عقده "الدليل الظاهري" ل "فورمسوثاد".
  2. انقر فوق خصائص، وفوق علامة التبويب أمان الدليل .
  3. انقر فوق تحرير ضمن التحكم المصادقة والوصول المجهول.
  4. حدد خانة الاختيار الوصول المجهول .
  5. إجراء الحساب المجهول للتطبيق حساب له إذن الوصول إلى Active Directory.
  6. انقر لإلغاء تحديد خانة الاختيار السماح IIS إلى كلمة مرور التحكم .
الحساب الافتراضي IUSR_computername ليس لديه الإذن "خدمة active Directory".

إنشاء صفحة Logon.aspx

اتبع هذه الخطوات لإنشاء نموذج ويب ASP.NET جديد اسم Logon.aspx:
  1. في "مستكشف الحلول"، انقر نقراً مزدوجاً فوق عقده المشروع أشر إلى إضافةوثم انقر فوق إضافة نموذج ويب.
  2. اكتب Logon.aspx في المربع الاسم ، ومن ثم انقر فوق فتح.
  3. في "مستكشف الحلول"، انقر بالزر الأيمن Logon.aspx، وثم انقر فوق عرض المصمم.
  4. انقر فوق علامة تبويب HTML في المصمم.
  5. استبدال التعليمات البرمجية الموجودة مع التعليمات البرمجية التالية:
    <%@ Page language="vb" AutoEventWireup="true" %><%@ Import Namespace="FormsAuthAd.FormsAuth" %>
    <html>
    <body>
    <form id="Login" method="post" runat="server">
    <asp:Label ID="Label1" Runat="server">Domain:</asp:Label>
    <asp:TextBox ID="txtDomain" Runat="server"></asp:TextBox><br>
    <asp:Label ID="Label2" Runat="server">Username:</asp:Label>
    <asp:TextBox ID="txtUsername" Runat="server"></asp:TextBox><br>
    <asp:Label ID="Label3" Runat="server">Password:</asp:Label>
    <asp:TextBox ID="txtPassword" Runat="server" TextMode="Password"></asp:TextBox><br>
    <asp:Button ID="btnLogin" Runat="server" Text="Login" OnClick="Login_Click"></asp:Button><br>
    <asp:Label ID="errorLabel" Runat="server" ForeColor="#ff3300"></asp:Label><br>
    <asp:CheckBox ID="chkPersist" Runat="server" Text="Persist Cookie" />
    </form>
    </body>
    </html>
    <script runat="server">
    sub Login_Click(sender as object,e as EventArgs)
    Dim adPath as String = "LDAP://DC=..,DC=.." 'Path to your LDAP directory server
    Dim adAuth as LdapAuthentication = new LdapAuthentication(adPath)
    try
    if(true = adAuth.IsAuthenticated(txtDomain.Text, txtUsername.Text, txtPassword.Text)) then
    Dim groups as string = adAuth.GetGroups()

    'Create the ticket, and add the groups.
    Dim isCookiePersistent as boolean = chkPersist.Checked
    Dim authTicket as FormsAuthenticationTicket = new FormsAuthenticationTicket(1, _
    txtUsername.Text,DateTime.Now, DateTime.Now.AddMinutes(60), isCookiePersistent, groups)

    'Encrypt the ticket.
    Dim encryptedTicket as String = FormsAuthentication.Encrypt(authTicket)

    'Create a cookie, and then add the encrypted ticket to the cookie as data.
    Dim authCookie as HttpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)

    if(isCookiePersistent = true) then
    authCookie.Expires = authTicket.Expiration
    end if
    'Add the cookie to the outgoing cookies collection.
    Response.Cookies.Add(authCookie)

    'You can redirect now.
    Response.Redirect(FormsAuthentication.GetRedirectUrl(txtUsername.Text, false))

    else
    errorLabel.Text = "Authentication did not succeed. Check user name and password."
    end if

    catch ex as Exception
    errorLabel.Text = "Error authenticating. " & ex.Message
    end try
    end sub
    </script>

  6. قم بتعديل المسار في الصفحة Logon.aspx للإشارة إلى ملقم دليل LDAP.
الصفحة Logon.aspx هي صفحة بتجميع المعلومات من المستخدم واستدعاء الأساليب في الفئة لدابوثينتيكيشن . بعد الرمز مصادقة المستخدم ويحصل على قائمة المجموعات، تقوم التعليمات البرمجية التالية بهذا الترتيب:
  • إنشاء كائن فورمسوثينتيكاتيونتيكيت ؛
  • تشفير التذكرة؛
  • يضيف تذكرة مشفرة إلى ملف تعريف ارتباط;
  • إضافة ملف تعريف الارتباط إلى مجموعة HttpResponse.Cookies ؛
  • إعادة توجيه الطلب إلى URL المطلوب أصلاً.

تعديل الصفحة WebForm1.aspx

الصفحة WebForm1.aspx هي الصفحة التي يتم طلبها بالأصل. عند قيام المستخدم بطلب هذه الصفحة، يتم توجيه الطلب إلى صفحة Logon.aspx. بعد أن تتم المصادقة على الطلب، يتم توجيه الطلب إلى الصفحة WebForm1.aspx.
  1. في "مستكشف الحلول"، انقر بالزر الأيمن WebForm1.aspx، وثم انقر فوق عرض المصمم.
  2. انقر فوق علامة تبويب HTML في المصمم.
  3. استبدال التعليمات البرمجية الموجودة مع التعليمات البرمجية التالية:
    <%@ Page language="vb" AutoEventWireup="true" %><%@ Import Namespace="System.Security.Principal" %>
    <html>
    <body>
    <form id="Form1" method="post" runat="server">
    <asp:Label ID="lblName" Runat="server" /><br>
    <asp:Label ID="lblAuthType" Runat="server" />
    </form>
    </body>
    </html>
    <script runat="server">
    sub Page_Load(sender as object, e as EventArgs)
    lblName.Text = "Hello " + Context.User.Identity.Name & "."
    lblAuthType.Text = "You were authenticated using " & Context.User.Identity.AuthenticationType & "."
    end sub
    </script>

  4. حفظ كافة الملفات ومن ثم ترجمة المشروع.
  5. طلب الصفحة WebForm1.aspx. لاحظ أنه يتم توجيهك إلى Logon.aspx.
  6. اكتب بيانات اعتماد تسجيل الدخول ومن ثم انقر فوق إرسال. عندما تتم إعادة توجيهك إلى الصفحة WebForm1.aspx، لاحظ أن يظهر اسم المستخدم الخاص بك وأن لدابوثينتيكيشن المصادقة اكتب الخاصية Context.User.Identity.AuthenticationType .
ملاحظة: توصي Microsoft باستخدام تشفير طبقة مأخذ التوصيل الآمنة (SSL) عند استخدام مصادقة النماذج. وهذا لأنه يتم تعريف المستخدم استناداً إلى ملف تعريف ارتباط مصادقة وتشفير SSL على تطبيق هذا يمنع أي شخص من تسوية ملف تعريف ارتباط المصادقة وقيمة المعلومات الأخرى التي يتم نقلها.

المراجع

لمزيد من المعلومات، انقر فوق أرقام المقالات التالية لعرضها في "قاعدة معارف Microsoft":
نظرة عامة حول أمان ASP.NET 306590

هوية العملية وطلب 317012 في ASP.NET

كيفية تطبيق الأمان المستند إلى الدور باستخدام المصادقة المستندة إلى النماذج في تطبيق ASP.NET الخاص بك باستخدام Visual Basic.NET 306238

313091 كيفية إنشاء المفاتيح باستخدام Visual Basic.NET لاستخدامه في مصادقة النماذج

313116 طلبات مصادقة النماذج غير موجهة إلى صفحة loginUrl

خصائص

رقم الموضوع: 326340 - آخر مراجعة: 09‏/01‏/2017 - المراجعة: 1

تعليقات