web-dev-qa-db-fra.com

Comment passer les informations d'authentification Windows du client au service d'API Web

Dans mon environnement d'entreprise, j'ai IIS7.5 hébergeant à la fois un service d'API Web et un site Web distinct qui effectue des appels dans ce service via la bibliothèque RestSharp. Les deux sont actuellement configurés avec l'authentification Windows.

Si je navigue vers l'un ou l'autre avec un navigateur, je suis invité à entrer mes informations d'identification Windows, et tout fonctionne très bien ... J'obtiens des pages Web que je veux et le service REST crache mon données. La partie que j'ai du mal à comprendre est de savoir comment utiliser une seule information d'identification pour l'authentification à la fois. Je ne peux pas comprendre comment transmettre les informations d'identification du site Web au service (j'ai essayé d'usurper l'identité mais cela n'a pas fonctionné) ou pour demander manuellement à l'utilisateur le nom d'utilisateur/mot de passe, puis les authentifier avec "Windows".

Aider un noob?

14
Jim Last

Si vous utilisez l'emprunt d'identité sur votre site Web et que l'API s'exécute sur le même serveur, cela devrait fonctionner.

http://msdn.Microsoft.com/en-us/library/aa292118 (v = vs.71) .aspx

Cependant, si vous déplacez l'API vers un serveur différent du site, cela ne fonctionnera plus. Une configuration à deux serveurs nécessite une délégation Kerberos.

9
Anders Bornholm

Paramètres de l'API Web

  1. Activer Windows Authentication

Paramètres de l'application Web

  1. Activer Windows Authentication
  2. Ajouter <identity impersonate="true" /> dans <system.web> de web.config
  3. Ajoutez ce qui suit dans le web.config:

     <system.webServer>
         <validation validateIntegratedModeConfiguration="false" />
     </system.webServer>
    
  4. Activer Windows Authentication et ASP.NET Impersonation dans IIS

Vous pouvez utiliser le code suivant pour POST data to Web API (and GET as well évidemment))

using (var client = new WebClient { UseDefaultCredentials = true })
{
    client.Headers.Add(HttpRequestHeader.ContentType, "application/xml; charset=utf-8");
    byte[] responseArray = client.UploadData("URL of web API", "POST", Encoding.UTF8.GetBytes(XMLText));
    string response = Encoding.ASCII.GetString(responseArray);
}

[~ # ~] note [~ # ~] : Si vous obtenez toujours des erreurs 401, vous devrez peut-être utiliser une adresse IP au lieu d'une adresse régulière nom de domaine pour votre URL (par exemple: 155.100.100.10 au lieu de mycompany.com)

11