ASP.NET MVC3 IIS6 السماح لمستخدمي المجال بالوصول إلى الموقع ولكن مستخدم آخر يتصل بقاعدة البيانات

StackOverflow https://stackoverflow.com/questions/4609477

سؤال

MVC 3 (ربما هو نفسه بالنسبة لـ 1 و 2) ، Server 2003 ، IIS 6 ، .NET 4 ، SQL Server 2005

لديّ تطبيق مسؤول بسيط لا سيقوم سوى شخصين أو 3 أشخاص بتسجيل الدخول إلى أي وقت مضى ، لذلك لا أريد أن أزعج مصادقة النماذج ، اسم المستخدم/PW وكل ذلك. أريد ببساطة أن يقوم المستخدم بتسجيل الدخول باستخدام مستخدم AD الحالي/PW. لكنني أريد الاتصال بخادم SQL عبر حساب مخصص يحتوي بالفعل على أذونات مناسبة لل DB المحدد.

لقد فعلت هذا في ASP الكلاسيكي مع السيناريو التالي

IIS: Enable anonymous Access: checked.  Username/pw dedicated account for the SQL Server DB
Integrated Windows authentication: unchecked
Digest authentication: unchecked
Basic authentication: unchecked
.NET Passport authentication: unchecked

يقبل تطبيق ASP الكلاسيكي نموذج HTML المنشور ، ثم يدقق عبر LDAP

' Establish connection
Set objConnection = Server.CreateObject("ADODB.Connection")

' Connection properties
objConnection.Provider = "ADsDSOOBJECT"
objConnection.Properties("User ID") = strUsername
objConnection.Properties("Password") = strPassword
objConnection.Properties("Encrypt Password") = True

' Open connection
objConnection.open "DS Query", strUsername, strPassword  ' user supplied user/pw

' Query Active Directory
strQuery = "SELECT cn FROM 'LDAP://" & strDomain & "' WHERE objectClass='*' "

Set objCommand = server.CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = strQuery

' Get recordset
Set objRS = objCommand.Execute

' If no record of user found
If objRS.BOF Or objRS.EOF Then

    ' User does not exist
    AuthenticateUser = False

Else

    ' User is authentic
    AuthenticateUser = True

End If

أريد هذا السلوك نفسه في .NET ، ولكن بدون نموذج HTML. يبدو من الممكن أنه عندما يزور المستخدم وحدة تحكم مع سمة [تفويض]:

[Authorize(Users = @"domain\user1, domain\user2, domain\user3")]

يجب أن يُطلب منهم إدخال المستخدم/PW الخاص بهم (أو لا مع IE ، اعتمادًا على خيارات المنطقة واللوجينات التلقائية) ثم يتم المصادقة عليها ، ومع ذلك استخدم المستخدم المخصص في IIS للاتصال بالديسيبل. كيف أنجز هذا؟

لقد افترضت دائمًا أن الانتحال هو السبيل للذهاب ، لذلك هذا في الويب الخاص بي.

  <system.web>
    <identity impersonate="true"/>
    <authentication mode="Windows" />

حاولت إضافة هذا ، لكن لا مساعدة:

  <anonymousIdentification enabled="false"/>
  <authorization>
      <allow users="*"/>
      <deny users="?"/>
  </authorization>

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

Cannot open database "Dbname" requested by the login. The login

باءت بالفشل. فشل تسجيل الدخول للمستخدم "المجال user3".

من الواضح أن الانتحال لا يفعل ما يفعله هنا.

لذلك ، يجب أن يكون هذا مثالًا نموذجيًا على كيفية المصادقة خلف جدار الحماية على شبكة Windows المتوسطة. ما هو أفضل طريقة؟ لقد فكرت مصادقة LDAP في ASP.NET MVC يبدو هذا أقرب إلى كيفية عمل الأشياء في تطبيق ASP الكلاسيكي ، لكن لسبب ما اعتقدت أنه يمكنني فقط الحصول على كل شيء يعمل مع الإعدادات والتكوين وحده.

EDIT1:

بعد قراءة بعض أمان Barry Dorrans ASP.NET الليلة الماضية ، يبدو أنه يمكنني تغيير مستخدم تجمع التطبيقات وأن يكون هذا هو المستخدم الذي يضرب SQL Server DB. هل هذا صحيح؟ أم أنها مستخدمي ANON في إعدادات موقع الويب التي تصل إلى DB؟

حاول تغيير مستخدم تجمع التطبيق ، لكن الحساب ليس جزءًا من مجموعة IIS_WPG. هذا مطلوب ، أليس كذلك؟

EDIT2:مع فحص المصادقة الأساسية ، تم فحص Anon مع مستخدم محدد ، أحصل على ما يلي:

User.Identity.Name: DOMAIN\jcurran
User.Identity.IsAuthenticated: True
User.Identity.AuthenticationType: Basic


WindowsIdentity.GetCurrent().AuthenticationType: Kerberos
WindowsIdentity.GetCurrent().Name: DOMAIN\jcurran
WindowsIdentity.GetCurrent().IsAuthenticated: True
WindowsIdentity.GetCurrent().IsAnonymous: False
WindowsIdentity.GetCurrent().IsGuest: False
WindowsIdentity.GetCurrent().IsSystem: False
WindowsIdentity.GetCurrent().ImpersonationLevel.ToString(): Impersonation


Thread.CurrentPrincipal.Identity.Name: DOMAIN\jcurran 

مع Auth Basic Detected ، تم التحقق من ANON مع مستخدم محدد ، أحصل على صفحة فارغة. تفكيك مع عوائد الكمان:

HTTP/1.1 401 Unauthorized
Date: Thu, 06 Jan 2011 18:02:42 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 3.0
Cache-Control: private
Content-Length: 0
هل كانت مفيدة؟

المحلول

على افتراض أنك ترغب في الوصول إلى خادم SQL باستخدام Windows Auth ، ثم تغيير هوية تجمع التطبيق هو الطريق للذهاب.

في web.config ستحتاج إلى ضبط impersonate="false" أو سيحاول ASP.NET استخدام بيانات اعتماد العميل للاتصال بقاعدة البيانات بدلاً من تجمع التطبيقات (أي يبدو أن الانتحال يفعل ما طلبته بالضبط).

في IIS ، يجب عليك تمكين مصادقة Windows المتكاملة ويمكنك تعطيل الوصول المجهول إذا كنت تريد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top