2009-12-15 4 views
0

J'ai une action de contrôleur ASP.Net MVC qui instancie un objet DataContext et je passe actuellement la chaîne de connexion directement dans le constructeur. J'utilise Impersonation et j'ai vérifié l'utilisateur actuel dans l'action du contrôleur est l'Authentification Windows actuelle. utilisateur de l'application Web, cependant, lors de l'exécution d'une trace SQL, la requête s'exécute toujours en tant que service réseau. L'objet de contexte de données est référencé dans un autre projet à partir de l'application Web, mais je transmets la chaîne de connexion directement dans le constructeur, cela ne devrait donc pas poser de problème. Voici ce qui est actuellement dans l'action du contrôleur:Linq to SQL dans ASP.Net MVC s'exécute en tant que service réseau lors de l'emprunt d'identité

 // verified the user is the current Windows Auth. user of the web app 
     var user = this.User; 

     var connectionString = "Data Source=serverName;Initial Catalog=dbName;Integrated Security=true"; 
     var context = new CustomDataContext(connectionString); 
     var test = context.Customers.Select(i => i.fullname).ToList(); 

Tout devient à l'amende de base de données à l'exception du fait que la requête fonctionne toujours en tant que service réseau au lieu de l'utilisateur actuel. Des idées sur pourquoi c'est le cas et comment résoudre?

Répondre

0

vous êtes le plus probable voyez Service réseau parce que c'est le compte par défaut que les pools d'applications exécutées sous IIS 6 et 7.

En général, il y a deux façons d'usurper l'identité dans les applications asp.net:

  1. l'identité < /> dans web.config
  2. Modifier l'identité du pool d'applications dans IIS

B Toutes ces options sont globales et affecteront toutes les demandes. Toutefois, il semble que vous vouliez emprunter l'identité de l'utilisateur Windows pour chaque utilisateur connecté. Si oui, voir This MS Knowledgebase article for sample code - Plus précisément, la section intitulée Emprunter l'identité d'un utilisateur spécifique dans le code

2

Donc, ce que vous voyez est un problème de délégation. L'identité ne circule pas automatiquement en dehors d'IIS.

Si vous avez tout configuré pour l'authentification Windows, vous devez envelopper vos appels d'ouverture de base de données pour utiliser temporairement l'Identité Windows pour les contextes en dehors de votre application Web. Le code se présente comme suit

using (((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate()) 
{ 
    // Perform database or network access here 
} 

Vous voudrez probablement envelopper cela dans un contrôle qui porte sur l'identité actuelle et fait en sorte qu'il est une identité de Windows

Questions connexes