2016-12-29 3 views
0

J'ai un site intranet ASP.NET 4.0 qui utilise l'authentification Windows et s'exécute normalement en tant qu'utilisateur IIS par défaut. Je voudrais usurper l'identité de l'utilisateur authentifié et agir en leur nom. Plus précisément, si cet utilisateur est un administrateur de domaine, je souhaite qu'il puisse surveiller les services s'exécutant sur un certain nombre de serveurs, démarrer et arrêter ces services et redémarrer ces serveurs, à partir de la page intranet.Gestion des machines sur le réseau à l'aide d'un site intranet ASP.NET avec authentification Windows

Jusqu'à présent, je peux basculer sur le contexte pour emprunter l'identité de l'utilisateur authentifié et je peux vérifier les groupes AD de l'utilisateur pour déterminer s'il s'agit d'un administrateur de domaine. Mais lorsque je tente d'obtenir l'état des services en cours d'exécution sur les autres serveurs, je reçois l'erreur suivante:

Cannot open Service Control Manager on computer 'MyServer'. This operation might require other privileges. ---> System.ComponentModel.Win32Exception: Access is denied

Il fonctionne très bien dans Visual Studio localement. Mais pas lorsque le site intranet est déployé sur le serveur Web interne.

Dans le Page_Load je fais ceci:

'Switch from IIS User to the currently authenticated Admin user 
Dim impersonationContext As WindowsImpersonationContext = Nothing 
Dim authenticatedIdentity As WindowsIdentity = DirectCast(HttpContext.Current.User.Identity, WindowsIdentity) 
impersonationContext = authenticatedIdentity.Impersonate() 

Et puis en cas de RowDataBoundGridView, je fais ceci:

'Check if service exists and is running 
Dim arrServices() As ServiceController = ServiceController.GetServices(machineName) 
If Not arrServices.Any(Function(o) o.ServiceName = SERVICE_NAME) Then 
    ' Service is missing... 
Else 
    Dim oServiceController As New ServiceController(SERVICE_NAME, machineName) 
    If oServiceController.Status = ServiceControllerStatus.Running Then 
     ' Service is running... 
    Else 
     ' Service has stopped... 
    End If 
End If 

Comment puis-je gérer d'autres serveurs pour le compte de l'utilisateur à l'aide Authentification Windows sur ce site intranet?

+0

Le code n'arrête pas simplement le traitement en mode silencieux. Peut-être devriez-vous montrer le code pertinent dans la question. – mason

+0

@mason S'il vous plaît voir ma question révisée. J'ai essayé d'attraper ce qui supprimait l'erreur. S'il vous plaît voir le vrai message d'erreur maintenant. – John

Répondre

0

Il s'avère qu'il existe essentiellement deux niveaux de jeton d'identité Windows que vous pouvez obtenir.

Celui que vous obtenez automatiquement lorsque vous utilisez l'authentification Windows sur un site intranet est bon pour l'authentification contre AD et l'obtention des groupes AD de l'utilisateur. Lorsque vous passez à l'identité de cette identité, vous pouvez accéder aux ressources locales sur le serveur Web en tant qu'utilisateur Windows authentifié, mais vous ne pouvez pas accéder aux ressources réseau en dehors du serveur Web sur lequel le site intranet est exécuté.

Pour accéder au réseau, vous devez utiliser l'API Windows Logon Win32. Vous devez effectuer un login de niveau "interactif" et obtenir le jeton de ce login. Ensuite, vous pouvez emprunter l'identité de l'utilisateur sur le réseau. Vous avez donc besoin du mot de passe de l'utilisateur, et pas seulement du jeton que ASP.NET vous donne dans l'objet de requête.