Cómo determinar si la llamada de servicio web proviene de los formularios de páginas autorizadas?

StackOverflow https://stackoverflow.com/questions/4601575

Pregunta

Tengo una aplicación asp.net web en la que yo uso varios servicios que servir varias peticiones ajax. El problema es cómo determinar si la llamada correspondiente viene la página que he servido. Yo uso la autenticación de formularios en mis páginas. ¿Hay alguna forma en la que yo pueda autorizar al usuario llamar a la weservice a través de la misma autenticación de formularios.

¿Fue útil?

Solución

Muy buena pregunta, sin duda!

Esto me recuerda a una vieja pregunta I ya ha respondido a . Su escenario es diferente, pero la raíz del problema sigue siendo el mismo: si se llama a un servicio web desde un formulario Web, la forma de compartir los datos de autenticación con la forma

?

No hay simple y estrecha en forma de solución a eso. Se puede pensar en la implementación de WS-Security en el servicio web, y tienen la Web Form autenticarse contra el Servicio Web después de comprobar que el usuario está autorizado.

El Servicio Web no compartir información acerca de la conexión del usuario a no ser aprobada explícitamente como método de parámetros (es decir. void PerformAction(string userId, ...)), pero recuerda que en este caso la perspectiva cambia radicalmente.

Esta es la mejor idea que viene a la mente, sin embargo, tener en cuenta que, o bien profundamente rediseñar su servicio web o no puede permitir que los clientes generados por los usuarios (es decir. Aplicaciones de escritorio que están compiladas en contra de su WSDL) a utilizar su servicio.

[Añadir] ahora que usted explicó su escenario un poco más detallada, aquí viene la parte emocionante de la ingeniería de software:)

Como dije en mi comentario, tiene varias opciones, por ejemplo:

  1. Almacenamiento de nombre de usuario / contraseña en el marcado de la página (en variables JavaScript) y tienen jQuery enviarlos como un parámetro para el servicio web. WS entonces autenticar la solicitud basándose en esos datos. Unrecommended porque si la caché de acceso a alguien usuario puede, se explota la contraseña (hay medios más fáciles para robaron la contraseña de alguien en un ordenador compartido / pública, no voy a hablar de ellos), y también porque si va a cambiar de HTTP plano a HTTPS para autenticación segura a continuación, debe asegurar el servicio web también
  2. aplicación web tienen generar una autenticación Moneda que es válido para el servicio web. Los sonidos idea como esta: en primer lugar, tienen un objeto compartido entre la aplicación web y servicios web (como un objeto dentro de la colección Application) o, en caso de aplicación web y servicios web están en servidores diferentes, utilizar un DBMS; a continuación, para la autenticación exitosa de cada aplicación web, generar un token único (ID de sesión puede estar bien) y almacenarlo en una variable JS que se pasará al servicio web; Por último, cuando se invoca el servicio web, compruebe contra dicho objeto compartido que el token es válido (es decir. usuario se autentica y todavía conectado, con permiso para acceder a ese servicio web, por lo tanto la autenticación como autorización ) , de lo contrario rechazar

Si otros chicos tienen ideas, no dude en ayuda;)

Otros consejos

Desde que está haciendo la autenticación foros se puede hacer algo como esto en su WebMethod

If Not HttpContext.Current.User.Identity.IsAuthenticated Then
    Return Nothing
End If

Tal vez sería mejor lanzar una excepción si se está haciendo un GET sin embargo, de esa manera el resultado vacío no consigue almacena en caché en el lado del cliente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top