Consulta integracion asp.net

Me pidieron que viera de integrar un proyecto en asp.net a un Single Sign On (simpleSAMLphp) que está corriendo en arai/huarpe.
Estuve experimentando en mi proyecto con el Nuget Sustainsys.SAML.httpmodule, pero sin éxito.
Tanto la documentación de dicho Nuget, como la documentación para integrar sistemas “no SIU” es algo escasa.
Quería saber si alguien ya tiene experiencia o conocimiento con este caso, o con herramientas que permitan hacer lo mismo, que podría ser útil en integrar un sistema basado en Asp.net con Arai/Huarpe.

Cualquier información es bienvenida por más básica que sea.

Hola Maximiliano!

Mira, te paso nuestra experiencia del lado SIU. Single SignOn es factible con cualquier tipo de aplicación compatible hoy con SAML versión 2.0. Este protocolo SAML está orientado u enfocado en aplicaciones tipo WEB, no así otras tipo mobile o desktop. Para eso requiere otras cosas…

Nuestra experiencia es al intentar integrar una app, usen extensiones como SAML Chrome Panel para depurar la interacción del lado del navegador (les va a permitir analizar que info envía el SP en la petición inicial hacia el IDP, que recibe y responde el IDP a su vez, etc).

Respecto a ASP.Net y la lib que referencias, no tenemos mucha idea al respecto… solo puedo divagar por el (código de ejemplo)[https://github.com/Sustainsys/Saml2/blob/master/Samples/SampleHttpModuleApplication/Web.config] y ver algunos parámetros que requieren datos del IDP de Araí… van a tener que leer bastante aquí como se usa en .Net.

Por el lado Araí, podrías tomar como base lo de (Moodle)[http://documentacion.siu.edu.ar/wiki/SIU-Arai/Integracion/Moodle], la parte importantes son:

  1. En Araí, es la sección “custom” tienen que colocar el entityID, el AssertionConsumerService y SingleLogoutService de la app ASP.Net.
  2. En la app ASP.Net tienen que configurarle (de alguna manera) la metadatada del IDP (la url de Araí, apuntando al IDP específicamente les lleva a un dashboard de admin, la pass se genera aleatoriamente al instalar), opcionalmente esepecificar el NameID policy, el mapping o que identificador usan para leer cual es el id del usuario (uniqueIdentifier es el estandar).

En mas o menos pasos, estarán trabajando con esos conceptos. Normalmente tenemos un módulo de consulta de metadatos tanto en el IDP como en un SP para verificar los datos. Huarpe, como SP lo tiene por ej, (adjunto) un SP o app tipo Toba lo tiene o incluso como el IDP de Arai!

Ante cualquier inconveniente no duden en escribir… al menos del lado donde mirar las cosas SIU podemos guiarlos.

Saludos!


sp-toba.png

sp-toba.png

idp.png

idp.png

huarpe.png

huarpe.png

He logrado progreso. Con mi idp de pruebas (https://stubidp.sustainsys.com/) logre enviarle un token SAML y obtener la respuesta adecuadamente y acceder a la informacion necesaria para loguearme en mi sitio.

Sin embargo, ahora estoy usando un IdP arai-usuarios de desarrollo y estoy recibiendo un mensaje de error:
SimpleSAML_Error_MetadataNotFound: METADATANOTFOUND(‘%’ => ‘\‘http://localhost:7152/saml2/\\’’), referer: http://localhost:7152/

Tengo entendido que es un problema que el IdP no reconoce al SP, pero sabria por donde empezar a decirle al IdP que reconosca dicho sitio

Nota: http://localhost:7152/saml2/ es donde se haya la metadata. Adjunto una imagen con la metadata de dicha url.

EDIT: Me dijeron que localhost puede no funcionar asi que ahora estoy probando todo lo mismo pero montado en un IIS y comunicandome con la ip de forma (https://123.123.123.123/default.aspx, https://123.123.123.123/saml2/acs, https://123.123.123.123/saml2, o lo que haga falta) pero sigue dandome el mismo error de METADATANOTFOUND.
¿Puede que a simplesamlphp no le agrade porque espera una url que termine en metadata.php o metadata.xml en ves de una que termine en /saml2? (simplesamlphp es mi IdP, y no puedo cambiarlo porque no es mi sistema)


metadata.png

metadata.png

(No se si va contra las reglas del foro el responder a mi propio ultimo comentario)
FInalmente logré conectar mi SP con el IdP, envio una SAML assertion, recibo la pantalla de logeo del IdP, y vuelvo a mi default.aspx; sin embargo, el SP no se logea automaticamente al recibir confirmacion del IdP que el usuario se logueó.
Considerando que la pass nunca viaja (y no deberia) en el token SAML… ¿como se supone que mi SP sepa que usuario se logueó en cuestion?
¿Se supone que unicamente verifique dicho usuario y el resto de las claims del token SAML y que eso sea suficiente?
¿Se supone que debo configurar o escribir codigo en mi SP para que esto suceda o deberia suceder por si solo?

Si alguien en el futuro tiene un problema similar al mio, pidame y subire en este post los detalles de mi configuracion funcionando cuando todo este proyecto termine…

Hola Maximiliano,

hasta donde se no hay regla contra eso, ni tendria sentido que lo hubiera tampoco asi que no te preocupes.

FInalmente logré conectar mi SP con el IdP, envio una SAML assertion, recibo la pantalla de logeo del IdP, y vuelvo a mi default.aspx; sin embargo, el SP no se logea automaticamente al recibir confirmacion del IdP que el usuario se logueó. Considerando que la pass nunca viaja (y no deberia) en el token SAML... ¿como se supone que mi SP sepa que usuario se logueó en cuestion?
Entre la metadata que te devuelve el token SAML vienen una serie de atributos estandar que son parte del mismo, vos podes usar uno de esos o utilizar alguno de los que agrega Araí, todo depende a que dato quieras acceder.

Por ej: en SIU-Toba usamos defaultUserAccount ya que para un sistema un mismo usuario puede tener varias cuentas, si no es tu caso podes utilizar algun otro para identificar al usuario ya sea uid, userID, uniqueID, etc.

En Arai-Usuarios al loguearte te muestra todos los campos que recibio en el token SAML y sus respectivos valores (al menos en desarrollo).

¿Se supone que unicamente verifique dicho usuario y el resto de las claims del token SAML y que eso sea suficiente?
Es una cuestion de confianza, le delegas al IDP la autenticacion del usuario... el te informa que se logueo JMFangio, si el mensaje es valido (esto lo deberia determinar la libreria que uses) y JMFangio es un usuario existente en tu aplicacion no hay mucho mas que puedas pedir.

Si es importante que verifiques que el token sigue siendo valido (eso tambien lo deberia proveer la libreria) para evitar dejar adentro a alguien que se deslogueo del IDP via otra aplicacion.
El tema de SLO es algo que evaluaras si tiene sentido o no, en nuestro caso van de la mano SSO y SLO.

¿Se supone que debo configurar o escribir codigo en mi SP para que esto suceda o deberia suceder por si solo?
Depende la funcionalidad que te provea la libreria, quizas debas realizar los chequeos de las assertions manualmente (no seria lo ideal) o no, lo mismo con la validez (por tiempo) del token y las redirecciones desde/hacia el IDP.

Lo que seguro vas a tener que incluir es el código para que una vez obtengas el usuario el mismo quede autenticado en tu aplicacion, el resto si lo podes delegar en la libreria mejor.

Saludos

Gracias por la respuesta. En estos días logre que el SSO funcione IdP init y tambien SP init.
Actualmente un problema está relacionados a mi libreria y el otro problema es relacionado con el hecho que el IdP SimpleSAMLphp no está firmando las LogoutRequest.
Si alguien sabe algo relacionado a lo ultimo, apreciaría ver que saben al respecto. (Nótese que estoy al tanto de que para activar las firmas necesito un certificado y que archivos debo editar en el IdP, simplemente no lo está haciendo, y ya pregunte en los foros de SimpleSAMLphp)

EDIT: En el foro SimpleSAMLphp me dejaron saber que como estoy usando redirect la firma no es parte del token SAML, es parte de la URL. En cuanto tenga tiempo revisaré eso.

Hola Maximiliano,

buenisimo, osea que al menos ya podes loguear un usuario sin problemas.

Actualmente un problema está relacionados a mi libreria y el otro problema es relacionado con el hecho que el IdP SimpleSAMLphp no está firmando las LogoutRequest. Si alguien sabe algo relacionado a lo ultimo, apreciaría ver que saben al respecto. (Nótese que estoy al tanto de que para activar las firmas necesito un certificado y que archivos debo editar en el IdP, simplemente no lo está haciendo, y ya pregunte en los foros de SimpleSAMLphp) EDIT: En el foro SimpleSAMLphp me dejaron saber que como estoy usando redirect la firma no es parte del token SAML, es parte de la URL. En cuanto tenga tiempo revisaré eso.

Osea… esta firmado pero en lugar de llegar con el token cae como un parametro via URL?, en dicho caso quizás tengas que incluir algo de código en el SP ya que según algunos issues que vi en Sustainsys están esperando que llegue firmado todo junto.
Segun el draft:

The message [b]MUST be signed [/b]if the HTTP POST or Redirect binding is used. The HTTP Artifact binding, if used, also provides for an alternate means of authenticating the request issuer when the artifact is dereferenced.

Asi que puede tratarse de alguna diferencia de interpretación entre ambos equipos.

Saludos

Ayer estuve chequeando… Se supone que si la firma esta en la URL, deberian haber claramente un parametro SigAlg que indique un algoritmo de encriptacion (usualemente SHA1 o SHA256) y un parametro más que se llama Sig cuyo valor es la firma en si. Ambos parametros se supone que son parte del estandar SAML y ninguno de ellos se encuentra en la URL.
Dicho eso, alguien tiene idea de como asegurarme que el IdP está usando los certificados correctos? Se supone que tengo un idp.crt y un arai-sync.key como claves publica y privada del IdP. He probado tratar de indicar al IdP que use dichos archivos, tambien he tratado usar la opcion certData y pegar la string del certificado en el metadata/saml20-sp-remote.php
Si alguien tiene conocimiento más profundo sobre como se supone que funciona el sistema de certificados y firma avise. Mientras tanto seguiré probando otras alternativas… (quiero intenter no tener que volver a generar certifiados en el IdP ya que no es mio y además ya está funcionando con otros SP que son del SIU, asi que supongo debe ser algo que se pueda solucionar solo tocando el sp-remote.php)

EDIT: Especificamente la URL luce como el siguiente ejemplo (si cieero sesion desde huarpe y no he abierto mi sitio):
https://desarrollo-arai-usuarios.unlam.edu.ar/idp/saml2/idp/SingleLogoutService.php?SAMLRequest=fZJRa8IwEMff%2FRSj77Zp2rQ1aGHgGAWnMMce9iJnc2qhTbpcOvz4q9UxlbE8hcv%2F97vkyJSgqVu5MHvTuVf87JDc6KFfx6bWJIfTmddZLQ1QRVJDgyRdKdePLwvJfSZba5wpTe3dYf9TQITWVUafsWI%2B81bLp8XquVhuSr4TOFFZEotdGkeqRMCUh6VSDIWANEyTOM227Iy%2Bo6XeM%2FN67UVG1GGhyYF2fZlxNmZ8zJK3UEjGpYg%2Bzrl5%2F9ZKgxvog3MtySBQSGCtqWszBgvVuKMObGXI73QNjY%2Bq88EGlWqD0yP5sFtXel%2FjeYZrtF9ViX57aL18aDM9BeVwKZv%2F0ebQN2jx1n9CggYdKHAwDa4NV85lP9ZinjeuV8EWL7lL9TfXyjXSaUaFVnjMN8B3CrdRBDzKxDZOkgx2gEnMVDRRkIkwjBIsYwEX4x0%2F%2BqnefJr8Gw%3D%3D&RelayState=http%3A%2F%2Fdesarrollo-huarpe.unlam.edu.ar%2Fsaml%2Flogout

Ahora si abri en algun momento mi sitio este es el LogoutRequest que le llega y rechaza porque no está firmado:
https://10.18.100.13/Saml2/logout?SAMLRequest=fVLbatwwEP0V43fbutiWLXYNgSWwkCZtt%2FShL8vYGiUCW3IlGfL5tb0NpIEGBBpGOjeNDgGmcZYP7tkt8Tv%2BXjDE5HUabZD7yTFdvJUOggnSwoRBxkFe7r48SJYTOXsX3eDG9B3kcwSEgD4aZ9PkfDqmV4SaE6hRcKE19rSitMWKqr7WmipSU9ZTFGwAlSY%2F0YcVeUxXohUewoJnGyLYuLYIIxlhGal%2F0EqSdYlfaXJa0xgLcUe9xDgHWRSU5LTJKVk3XlxWx6wY9%2Fhp8ujik33ydzqi%2F8hJyc7ZHbaQclf33RunwgDeu3F0GXgw2RIW8MaFfLEjTDmqJQdfGDUXYRfcqgkjKIiQzy%2FzoXjPepN4XB%2FvfEouX7fi2wKj0Waz9f8caXLv%2FATx8xFsHaMyvV%2BV0YMNBm1Mu6umvAXGBQjO26HHtq17oQgZSsVI23KoSlrqpqn4X783ize%2Fs7xg2OZztgpfuysF0dSlaEXTq0pwYJqBpoJSrlvdVFXf0H7Akg%2FiRvYB%2F9b852d2fwA%3D&RelayState=_4c0e026a59a922eb284d03b87cb7550755443e35fb

Lo mismo. SAMLRequest y RelayState.

No puedo hacer que el SP no pida LogoutRequests no firmadas ya que el autor de la libraria dice que va en contra del estandar SAML y es un riesgo de seguridad. Pero si se que SimpleSAML puede activar la firma de dichos mensajes.

EDIT4: Estuve tocando el saml20-sp-remote.php equivocado todo el tiempo… SLO funciona perfecto, y las LogoutRequest estan siendo firmadas. Mi ultimo problema es convenser a la libreria Sustainsys que “ejemplo.com/saml2/logout” es una URL no relativa asi el get_query no me tira error. Revisaré el mailing list de Sustainsys y si tengo éxito reportaré aqui.

Hola Maximiliano,

me detengo aca por lo que te marque en negrita, arai-sync.key no es la clave privada del IdP… es la clave que se usa para realizar la sincronizacion/adhesion etc de tu aplicacion contra Arai-Registry.
Dicho de otra manera, el IdP no tiene porque usar arai-sync.key como clave privada, deberias tener un par key/crt como en cualquier sitio web con SSL (que ademas lo usa para firmar los request).

[b]EDIT4: Estuve tocando el saml20-sp-remote.php equivocado todo el tiempo... SLO funciona perfecto, y las LogoutRequest estan siendo firmadas. Mi ultimo problema es convenser a la libreria Sustainsys que "ejemplo.com/saml2/logout" es una URL no relativa asi el get_query no me tira error. Revisaré el mailing list de Sustainsys y si tengo éxito reportaré aqui.[/b]
A que sp-remote.php te referis?... si estabas agregando tu aplicacion al IdP en todo caso deberias haber modificado el archivo idp.yml que se encuentra dentro de la carpeta /config, fijate que hay una seccion [i]service_provider[/i] , dentro de [b]custom[/b] deberias haber incluido la configuracion para tu SP, no deberia ser necesario que modifiques el archivo saml20-sp-remote.php directamente.

Saludos

SI modifique el idp.yml adecuadamente.
El sp-remote no estaba en la carpeta por defecto (segun SimpleSAMLphp). YO esperaba que estuviera en config/saml20-sp-remote.php y estaba en config/carpetaEjemplo/saml20-sp-remote.php

De cualquier forma, ya logre tener el SSO y SLO funcionando, así que una vez que termine de corregir todas aquellas paginas que antes dependian de que hubiera una contraseña y ahora ya no la tienen, empezaré a replicar mi proceso con algun otro sistema y veré de crear una breve documentación del proceso.

Hola Maximiliano!

Copado que hayan podido avanzar en la integración de su app ASP.Net. Cuando lo tengan aceitado, estaremos encantados de que escriban un mini howto al respecto, lo pondremos en la wiki así se visibiliza.

Saludos!

Lamento venir con más preguntas que soluciones, pero en mi trabajo cambiaron a un entorno de desarrollo Arai-Usuarios 3.0 recientemente, y despues de leer la documentación (https://documentacion.siu.edu.ar/usuarios/docs/cache/guia-registrando-aplicacion-sp/) veo que es requisito el entityID, la url para ACS y la url para single logout.
Todo bien hasta ahí, el tema es que en Arai-Usuarios 2.3 yo logré hacer funcionar mi proyecto ddde la siguiente manera:
Tomar la metadata (.XML) de mi SP y procesandola con el conversor del panel de admin de SimpleSAMLphp, agregaba las líneas

‘redirect.sign’ => true,

‘sign.logout’ => true,

Luego pegaba el resultaddo en el archivo saml20-sp-remote-sp.php, y tambien editaba el idp.yml para que reconosca al SP custom:

        'https://localhost:44342/Saml2': 

            AssertionConsumerService: 'https://ejemplo/Saml2/acs' 

            SingleLogoutService: 'https://ejemplo/Saml2/logout' 

            appUniqueId: unx-ejemplo_1 

Mi duda, es ahora que el archivo idp.yml parece no existir más dentro de la nueva estructura de contenedores, como puedo lograr decirle al IdP que debe firmar las logout requests enviadas a mi SP. He probado agregar dichas lineas que le dicen a SimpleSAMLphp que firme las logout. Puedo logearme, pero al hacer logout, tengo un error que dice .
Caused by: Exception: saml20-sp-remote/‘https://url_de_mi-SP/Saml2’: The option ‘sign.logout’ is not a valid boolean value.
Si alguien vio algo remotamente parecido en sus implementaciones de Arai-Usuarios 3.0, estaria agradecido de saber de ello.

Hola Maximiliano,

En realidad la cosa no cambia tanto salvo por un pequeño detalle, ya no se usan dichos archivos yml, esa info queda guardada en la bd de Arai.
De todas maneras, como la informacion que se necesita es basicamente la misma… hay forma de ingresarla.

Mi duda, es ahora que el archivo idp.yml parece no existir más dentro de la nueva estructura de contenedores, como puedo lograr decirle al IdP que debe firmar las logout requests enviadas a mi SP. He probado agregar dichas lineas que le dicen a SimpleSAMLphp que firme las logout. Puedo logearme, pero al hacer logout, tengo un error que dice . [b] Caused by: Exception: saml20-sp-remote/'https://url_de_mi-SP/Saml2': The option 'sign.logout' is not a valid boolean value.[/b] Si alguien vio algo remotamente parecido en sus implementaciones de Arai-Usuarios 3.0, estaria agradecido de saber de ello.

La informacion del SP ahora se carga via la operacion de aplicaciones dentro de Arai-Usuarios, como es una carga manual… lo que te va a cambiar seguro es el app-unique-id… que ahora pasa a ser generado como uuid y no es algo hecho manualmente como antes.

http://foro.comunidad.siu.edu.ar/index.php?action=dlattach;topic=19131.0;attach=17474;image

Hasta ahi diste de alta la aplicacion, para incorporar la info del SP… tenes que pasar a la pestaña “Conector SAML” e ir cargando los datos que ponias anteriormente en el archivo… segun tu ejemplo te quedaria algo asi:

http://foro.comunidad.siu.edu.ar/index.php?action=dlattach;topic=19131.0;attach=17476;image

Fijate que tenes un campo donde podes agregar opciones para SP en formato JSON.
Con la configuracion tal como muestra la imagen, el SP deberia quedarte tal como cuando lo hacias manualemente.

Saludos


alta-aplicacion.png

alta-aplicacion.png

saml-sp.png

saml-sp.png

Gracias por el ejemplo. Todavia tengo que ajustar algunos parametros en el IdP o en mi SP, porque si inicio deslogueo desde mi SP no regresa a la página default, regresa a la ip base… pero seguramente pueda corregirlo por mi cuenta.
Seré curioso, sabias que cambio debía aplicar porque era un error común, o porque también implementaste una solución similar?

Hola Maximiliano,

Cuando haces el pedido de logout, estas enviando el parametro ReturnTo ? Ahi podes especificar a que pagina queres que vuelva.

Seré curioso, sabias que cambio debía aplicar porque era un error común, o porque también implementaste una solución similar?
Lo sabia porque estuve haciendo parte del cambio :)

Saludos