Estoy desarrollando una API utilizando el tiempo de ejecución de C# ASP.Net Core y planeo alojarla en IIS.
Uno de los requisitos es obtener información de otro servidor API RESTful que actualmente tenga autenticación de Windows (autenticación LDAP).
Ya tengo una solución usando una cuenta de servicio que codifica el nombre y la contraseña de la cuenta de servicio en appsettings.json.
El código es el siguiente
var serviceApi = _config["Api:ServiceApi"].ToString(); // this is the URL of other RESTful API from appsettings.json var serviceAccount = _config["ServiceAccount:UserName"].ToString(); // service account username from appsettings.json var serviceAccountPwd = _config["ServiceAccount:Password"].ToString(); // service account password which is currently shown as clear text in appsettings.json var serviceAccountDomain = _config["ServiceAccount:Domain"].ToString(); // service account domain name from appsettings.json var client = new WebClient(); CredentialCache cc = new CredentialCache(); cc.Add( new Uri(serviceApi), "NTLM", new NetworkCredential(serviceAccount, serviceAccountPwd, serviceAccountDomain)); client.Credentials = cc; client.Headers["Content-Type"] = "application/json"; string response = client.DownloadString($"{serviceApi}/User");
La desventaja de esta solución es que la contraseña de la cuenta de servicio está visible en appsettings.json. Necesito otra solución que no exponga la contraseña en texto sin cifrar.
Una de las soluciones que se me ocurre es almacenar la información de la cuenta de servicio en la identidad del grupo de aplicaciones de IIS. Sin embargo, todavía no puedo hacer que WebClient use la identidad del grupo de aplicaciones de IIS. Lo que puedo hacer hasta ahora para que WebClient use mi propia credencial NTLM desde Windows.
aquí está el código
var serviceApi = _config["Api:ServiceApi"].ToString(); var client = new WebClient(); client.UseDefaultCredentials = true; // this is not getting credential from IIS app pool identity but rather from logged in account in windows operating system client.Headers["Content-Type"] = "application/json"; string response = client.DownloadString($"{serviceApi}/User");
¿Podría ayudarme a usar la identidad del grupo de aplicaciones de IIS como credencial para otra aplicación de API RESTful?
En última instancia, descubrimos que no podíamos lograr esto, ya que técnicamente compromete la seguridad del usuario que inició sesión a menos que habilite la autenticación de Windows/NTLM en el servidor API (y esto requiere que el navegador/cliente habilite activamente compartir las credenciales de Windows del usuario con el servidor).
La solución que terminamos usando fue usar un secreto previamente compartido, en forma de AppId y AppSecret, que parece ser el enfoque estándar. Esencialmente, emitimos a la aplicación de llamada un nombre de usuario y una contraseña que existen fuera de AD.
Parece que tiene algún malentendido acerca de la autenticación de Windows.
Entonces, dado todo lo anterior. Desea utilizar Windows Integrated Security con Kerberos SPNEGO entre su servidor web frontend y el servidor web backend.
La siguiente será una breve guía de solución de problemas.