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

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

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

اضغط هنا لرابط المقالة باللغة الانجليزية316748
يشير هذه المقالة التالية 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 C# .NET

اتبع الخطوات التالية لإنشاء تطبيق ويب ASP.NET جديد يسمى FormsAuthAd في Visual C# .NET:
  1. بدء تشغيل Microsoft Visual Studio .NET.
  2. من القائمة ملف، أشر إلى جديد ثم انقر فوق المشروع.
  3. انقر فوق Visual C# مشاريع ضمن أنواع Project ثم انقر فوق تطبيق ويب ASP.NET ضمن قوالب.
  4. في المربع الموقع، استبدل WebApplication1 FormsAuthAd.
  5. انقر فوق موافق.
  6. انقر بزر الماوس الأيمن فوق العقدة المراجع في "مستكشف الحلول" ومن ثم انقر فوق إضافة مرجع.
  7. ضمن علامة التبويب .NET في مربع الحوار إضافة المرجع انقر فوق System.DirectoryServices.dll انقر فوق تحديد ثم انقر فوق موافق.

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

اتبع الخطوات التالية لإنشاء ملف فئة جديدة باسم LdapAuthentication.cs:
  1. في "مستكشف الحلول" انقر بزر الماوس الأيمن فوق عقدة المشروع أشر إلى إضافة ثم انقر فوق إضافة عنصر جديد.
  2. انقر فوق فئة ضمن قوالب.
  3. اكتب LdapAuthentication.cs في المربع الاسم ، ثم انقر فوق فتح.
  4. استبدال التعليمات البرمجية الموجودة في ملف LdapAuthentication.cs التعليمة البرمجية التالية.
    using System;using System.Text;using System.Collections;using System.DirectoryServices;namespace FormsAuth{	  public class LdapAuthentication  {    private String _path;    private String _filterAttribute;    public LdapAuthentication(String path)    {      _path = path;    }		    public bool IsAuthenticated(String domain, String username, String pwd)    {      String domainAndUsername = domain + @"\" + username;      DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd);			      try      {	//Bind to the native AdsObject to force authentication.			         Object obj = entry.NativeObject;	DirectorySearcher search = new DirectorySearcher(entry);	search.Filter = "(SAMAccountName=" + username + ")";	search.PropertiesToLoad.Add("cn");	SearchResult result = search.FindOne();	if(null == result)	{  	  return false;	}	//Update the new path to the user in the directory.	_path = result.Path;	_filterAttribute = (String)result.Properties["cn"][0];      }      catch (Exception ex)      {        throw new Exception("Error authenticating user. " + ex.Message);      }	return true;     }     public String GetGroups()     {       DirectorySearcher search = new DirectorySearcher(_path);       search.Filter = "(cn=" + _filterAttribute + ")";       search.PropertiesToLoad.Add("memberOf");       StringBuilder groupNames = new StringBuilder();       try       {         SearchResult result = search.FindOne();	 int propertyCount = result.Properties["memberOf"].Count;   	 String dn;	 int equalsIndex, commaIndex;					 for(int propertyCounter = 0; propertyCounter < propertyCount; propertyCounter++)	 {	   dn = (String)result.Properties["memberOf"][propertyCounter];    	   equalsIndex = dn.IndexOf("=", 1);	   commaIndex = dn.IndexOf(",", 1);	   if(-1 == equalsIndex)	   {	     return null;     	   }           groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1));	   groupNames.Append("|");    	 }       }       catch(Exception ex)       {         throw new Exception("Error obtaining group names. " + ex.Message);       }			       return groupNames.ToString();     }   }}					
يقبل رمز مصادقة مجال "و" اسم مستخدم "،" كلمة مرور "و" مسار إلى شجرة وحدة التحكم في "Active Directory". يستخدم هذا الرمز الموفر دليل LDAP.

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

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

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

تدعم معظم برامج استعراض ملفات تعريف الارتباط حتى 4096 بايت. إذا كان قد هذه السلسلة المحتمل أن يتجاوز طول ملف تعريف الارتباط, قد تحتاج إلى تخزين معلومات المجموعة في كائن ذاكرة التخزين المؤقت 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.cs:
    using System.Web.Security;using System.Security.Principal;					
  3. استبدال معالج الأحداث فارغة موجودة لـ Application_AuthenticateRequest التعليمة البرمجية التالية.
    void Application_AuthenticateRequest(Object sender, EventArgs e){  String cookieName = FormsAuthentication.FormsCookieName;  HttpCookie authCookie = Context.Request.Cookies[cookieName];  if(null == authCookie)  {//There is no authentication cookie.    return;  }			  FormsAuthenticationTicket authTicket = null;	  try  {    authTicket = FormsAuthentication.Decrypt(authCookie.Value);  }  catch(Exception ex)  {    //Write the exception to the Event Log.    return;  }	  if(null == authTicket)  {//Cookie failed to decrypt.    return;		  }			  //When the ticket was created, the UserData property was assigned a  //pipe-delimited string of group names.  String[] groups = authTicket.UserData.Split(new char[]{'|'});  //Create an Identity.  GenericIdentity id = new GenericIdentity(authTicket.Name, "LdapAuthentication");	  //This principal flows throughout the request.  GenericPrincipal principal = new GenericPrincipal(id, groups);  Context.User = principal;	}					

تعديل ملف Web.config

في هذا المقطع تكوين في <forms> ، <authentication> ، و في <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="10" 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. إجراء الحساب المجهول للتطبيق حساب لديه إذن "Active Directory".
  4. انقر لإلغاء تحديد خانة الاختيار "السماح IIS إلى المرور التحكم".
  5. في المقطع “ وصول Authenticated ” ، قم بإلغاء تحديد خانة الاختيار “ مصادقة تكامل Windows ”.
  6. انقر فوق موافق.
  7. انقر فوق تطبيق
ليس لدى حساب 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="c#" AutoEventWireup="true" %><%@ Import Namespace="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>void Login_Click(Object sender, EventArgs e){  String adPath = "LDAP://corp.com"; //Fully-qualified Domain Name  LdapAuthentication adAuth = new LdapAuthentication(adPath);  try  {    if(true == adAuth.IsAuthenticated(txtDomain.Text, txtUsername.Text, txtPassword.Text))    {      String groups = adAuth.GetGroups();      //Create the ticket, and add the groups.      bool isCookiePersistent = chkPersist.Checked;      FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,  txtUsername.Text,	DateTime.Now, DateTime.Now.AddMinutes(60), isCookiePersistent, groups);	      //Encrypt the ticket.      String encryptedTicket = FormsAuthentication.Encrypt(authTicket);		      //Create a cookie, and then add the encrypted ticket to the cookie as data.      HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);      if(true == isCookiePersistent)	authCookie.Expires = authTicket.Expiration;				      //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.";    }  }  catch(Exception ex)  {    errorLabel.Text = "Error authenticating. " + ex.Message;  }}</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. استبدال التعليمات البرمجية الموجودة code.
    <%@ Page language="c#" 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>void Page_Load(Object sender, EventArgs e){  lblName.Text = "Hello " + Context.User.Identity.Name + ".";  lblAuthType.Text = "You were authenticated using " +   Context.User.Identity.AuthenticationType + ".";}</script>					
  4. احفظ كافة الملفات ومن ثم ترجمة المشروع.
  5. طلب الصفحة WebForm1.aspx. لاحظ أن تتم إعادة توجيهك إلى Logon.aspx.
  6. اكتب بيانات اعتماد تسجيل الدخول ثم انقر فوق إرسال. عندما تتم إعادة توجيهك إلى WebForm1.aspx ، اكتب ملاحظة يظهر اسم المستخدم وأن LdapAuthentication المصادقة الخاصية Context.User.AuthenticationType.
ملاحظة توصي Microsoft في استخدام مآخذ التوصيل الآمنة (SSL) التشفير عند استخدام مصادقة النماذج. وهذا لأنه يتم تعريف المستخدم استناداً إلى ملف تعريف ارتباط المصادقة تشفير SSL على هذا التطبيق يمنع أي شخص من تسوية ملف تعريف ارتباط المصادقة و وأية معلومات أخرى هامة نقل.
مراجع
لمزيد من المعلومات، انقر فوق أرقام المقالات التالية لعرضها في "قاعدة المعارف لـ Microsoft:
306590نظرة عامة حول أمان ASP.NET،
317012هوية عملية وطلب في ASP.NET
311495كيفية تطبيق الأمان المستند إلى الدور مع المصادقة المستندة إلى النماذج في تطبيقات ASP.NET باستخدام Visual C# .NET
313091كيفية إنشاء مفاتيح باستخدام Visual Basic .NET لاستخدامه في مصادقة النماذج
313116لم يتم توجيه طلبات المصادقة النماذج إلى صفحة loginUrl

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

خصائص

رقم الموضوع: 316748 - آخر مراجعة: 10/16/2007 17:59:02 - المراجعة: 5.4

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

  • kbmt kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms KB316748 KbMtar
تعليقات
;did=1&t=">l_footerNavLink" data-bi-name="Footer_Privacy&cookies" data-bi-slot="2"> الخصوصية وملفات تعريف الارتباط
  • العلامات التجارية
  • © 2016 Microsoft
  • >mp;t=">if?DI=4050&did=1&t=">d=1&t=">>