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?
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.
Paramètres de l'API Web
Windows Authentication
Paramètres de l'application Web
Windows Authentication
<identity impersonate="true" />
dans <system.web>
de web.configAjoutez ce qui suit dans le web.config:
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>
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)