ASP.NET MVC3 IIS6 Autoriser les utilisateurs du domaine pour accéder au site, mais un autre utilisateur Connexion à la base de données

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

Question

MVC 3 (probablement la même chose pour 1 & 2), Server 2003, IIS 6, 4 .NET, SQL Server 2005

J'ai une application simple d'administration que seuls 2 ou 3 personnes constateront se connecter à, donc je ne veux pas vous embêter avec authentification par formulaire, le nom d'utilisateur distinct / pw et tout cela. Je veux avoir tout simplement l'utilisateur se connecter avec leur utilisateur AD existant / pw. Mais je veux me connecter à SQL Server via un compte dédié qui a déjà des autorisations appropriées pour le DB sélectionné.

Je l'ai fait en asp classique avec le scénario suivant

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

L'application classique accepte asp un formulaire HTML affiché, authentifie via 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

Je veux que ce même comportement dans .NET, mais sans le formulaire HTML. Il semble possible que lorsque l'utilisateur visite un contrôleur avec un attribut [Authorize]:

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

qu'ils devraient être invités à entrer leur utilisateur AD / pw (ou non avec IE, en fonction de la zone et les options de connexion automatique) alors authentifié, mais utiliser l'utilisateur dédié dans IIS pour se connecter à la DB. Comment puis-je y parvenir?

Je l'ai toujours pensé usurpation d'identité était la voie à suivre, donc c'est dans mon web.config:

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

J'ai essayé d'ajouter, mais aucune aide:

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

Je peux tout à travailler pour moi si j'utilise l'authentification de base, mais c'est seulement parce que mon compte a également accès à la DB. Si un autre utilisateur qui est dans ce que les utilisateurs = liste, mais n'a pas accès à la DB tente, ils reçoivent:

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

a échoué.       Échec de la connexion pour 'domaine \ user3' utilisateur.

Il est évident que l'usurpation d'identité ne fait pas sa chose ici.

Alors, ce doit être un exemple assez typique de la façon d'authentifier derrière le pare-feu sur votre réseau Windows moyenne. Quelle est la meilleure approche? Je l'ai considéré comme un AuthorizeAttribute personnalisé à l'aide du code similaire authentification LDAP dans ASP. net MVC Cela semble plus proche de la façon dont les choses ont fonctionné dans l'application asp classique, mais pour une raison quelconque, je pensais que je pouvais tout faire fonctionner avec les paramètres et configuation seul.

EDIT1:

Après avoir lu début ASP.NET Security Barry Dorrans hier soir, il semble que je peux changer l'utilisateur du pool d'applications et ont ce soit l'utilisateur qui frappe le DB SQL Server. Est-ce correct? Ou est-ce les utilisateurs Anon dans les paramètres du site Web qui frappe le DB?

essayé de changer le baigneur d'application, mais le compte ne fait pas partie du groupe IIS_WPG. Ce qui est nécessaire, non?

EDIT2: Avec auth de base vérifié, anon vérifié avec l'utilisateur spécifié, j'obtiens ce qui suit:

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 

Avec sans contrôle de base, anon vérifié avec l'utilisateur spécifié, je reçois une page blanche. Inspectant avec des rendements violonistes:

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
Était-ce utile?

La solution

En supposant que vous voulez accéder au serveur SQL avec Windows Auth, puis changer l'identité du pool d'application est le chemin à parcourir.

En web.config vous devez définir impersonate="false" ou ASP.NET essayera d'utiliser les informations d'identification du client pour se connecter à la base de données au lieu de la piscine de app (il ressemble à l'usurpation d'identité est en train de faire exactement ce que vous avez demandé à faire ).

Dans IIS, vous devez activer l'authentification Windows intégrée et vous pouvez désactiver l'accès anonyme si vous le souhaitez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top