أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

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

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية326340
تشير هذه المقالة إلى مساحات أسماء Microsoft .NET Framework فئة مكتبة التالية:
  • System.Text
  • System.DirectoryServices
  • System.Security.Principal
  • System.Web.Security

في هذه المهمة

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

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

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

اتبع الخطوات التالية لإنشاء تطبيق ويب ASP.NET جديد يسمى FormsAuthAd في Visual Basic .NET:
  1. بدء تشغيل Microsoft Visual Studio .NET.
  2. من القائمة ملف، أشر إلى جديد ثم انقر فوق المشروع.
  3. انقر فوق مشاريع Visual Basic ضمن أنواع Project ثم انقر فوق تطبيق ويب 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 التعليمة البرمجية التالية: _path
    Imports SystemImports System.TextImports System.CollectionsImports System.DirectoryServicesNamespace 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 ClassEnd Namespace					

شرح التعليمات البرمجية

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

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

لاحظ أن الأسلوب 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

في هذا المقطع يمكنك تكوين formsauthentication بالإضافة إلى عناصر authorization في ملف 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>				
إشعار identity impersonate="true" / عنصر التكوين. يؤدي هذا ASP.NET تمثيل حساب الذي تم تكوينه ليكون الحساب المجهول من Microsoft خدمات معلومات إنترنت (IIS). نتيجة هذا التكوين تشغيل كافة الطلبات إلى هذا التطبيق تحت سياق الأمان لحساب تكوينها. المستخدم توفير بيانات الاعتماد لمصادقة مقابل "Active Directory" ولكن الحساب يمكنه الوصول إلى "Active Directory" هو الحساب الذي يتم تكوينه. لمزيد من المعلومات، راجع REFERENCES المقطع.

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

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

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

اتبع الخطوات التالية لإنشاء نموذج ويب ASP.NET جديدة باسم Logon.aspx:
  1. في "مستكشف الحلول" انقر بزر الماوس الأيمن فوق عقدة المشروع أشر إلى إضافة ثم ثم انقر فوق إضافة نموذج ويب.
  2. اكتب Logon.aspx في المربع الاسم ، ثم انقر فوق فتح.
  3. في "مستكشف الحلول" انقر بزر الماوس الأيمن فوق Logon.aspx ومن ثم انقر فوق عرض مصمم.
  4. انقر فوق علامة التبويب HTML في "مصمم".
  5. Replace the existing code with the following code:
    <%@ 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 tryend sub</script>					
  6. قم بتعديل المسار في الصفحة Logon.aspx للإشارة إلى ملقم دليل LDAP.
الصفحة Logon.aspx هي صفحة التي تقوم بتجميع المعلومات من أساليب استدعاء والمستخدم على فئة LdapAuthentication. بعد التعليمة البرمجية يصادق على المستخدم الحصول على قائمة المجموعات بتنفيذ التعليمات البرمجية التالية بهذا الترتيب:
  • يقوم بإنشاء كائن FormsAuthenticationTicket;
  • يعمل تشفير التذكرة;
  • يضيف تذكرة مشفرة إلى ملف تعريف ارتباط;
  • إضافة ملف تعريف الارتباط إلى المجموعة 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 ، اكتب ملاحظة يظهر اسم المستخدم وأن LdapAuthentication المصادقة الخاصية Context.User.Identity.AuthenticationType.
ملاحظة توصي Microsoft في استخدام مآخذ التوصيل الآمنة (SSL) التشفير عند استخدام مصادقة النماذج. وهذا لأنه يتم تعريف المستخدم استناداً إلى ملف تعريف ارتباط المصادقة تشفير SSL على هذا التطبيق يمنع أي شخص من تسوية ملف تعريف ارتباط المصادقة و وأية معلومات أخرى هامة نقل.
مراجع
لمزيد من المعلومات، انقر فوق أرقام المقالات التالية لعرضها في "قاعدة المعارف لـ Microsoft:
306590نظرة عامة حول أمان ASP.NET،
317012هوية عملية وطلب في ASP.NET
306238كيفية تطبيق الأمان المستند إلى الدور مع المصادقة المستندة إلى النماذج في تطبيقات ASP.NET باستخدام Visual Basic .NET
313091كيفية إنشاء مفاتيح باستخدام Visual Basic .NET لاستخدامه في مصادقة النماذج
313116لم يتم توجيه طلبات المصادقة النماذج إلى صفحة loginUrl

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 326340 - آخر مراجعة: 03/22/2007 11:28:33 - المراجعة: 4.5

Microsoft ASP.NET 1.0, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft ASP.NET 1.1, Microsoft Visual Basic .NET 2003 Standard Edition

  • kbmt kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms KB326340 KbMtar
تعليقات
(Math.random() * 16).toString(16); })).replace("R", (8 | Math.floor(Math.random() * 3)).toString(16)); var m = document.createElement("meta"); m.content = guid; m.name = "ms.dqid"; document.getElementsByTagName("head")[0].appendChild(m);