2010-04-14 15 views
7

tengo el siguiente escenario:autenticados WCF: Obtener el contexto de seguridad actual

  • he almacenado de datos diferentes de usuario en mi base de datos.
  • Esta información se ingresó a través de una aplicación web.
  • Queremos exponer estos datos al usuario a través de un servicio web para que puedan integrar sus datos con sus aplicaciones.
  • También nos gustaría exponer algunos lógica de negocios sobre estos servicios. Como tal no deseamos utilizar OData.
  • Esta es una aplicación multi-arrendatario por lo que sólo quiere exponer sus datos de nuevo a ellos y no otros usuarios. Del mismo modo, la lógica comercial que exponemos debe ser relativa al usuario autenticado.

Me gustaría dejar que el usuario use un esquema OASIS para autenticarse con el servicio web - WCF ya lo permite de fábrica, o tal vez podamos emitir certificados para autenticar con . Ese bit aún no se ha resuelto.

Aquí es un poco de pseudo-código de cómo me imagino que esto funcionaría dentro del servicio:

function GetUsersData(id) 
var user := Lookup User based on Username from Auth Context 
var data := Get Data From Repository based on "user" 
return data 
end function 

Para el escenario de la lógica de negocio que creo que sería algo como esto:

function PerformBusinessLogic(someData) 
var user := Lookup User based on Username from Auth Context 
var returnValue := Perform some logic based on supplied data 
return returnValue 
end function 

¡Lo difícil aquí es obtener el nombre de usuario actual (o información de cert en el escenario de cert) con el que el usuario se autenticó!

¿WCF incluso habilita este escenario? Si no, ¿WSE3 lo habilitaría?

Gracias,

Respuesta

16

En caso de que en realidad no sea demasiado duro, pienso:

  • si los usuarios autenticados, con credenciales de usuario de Windows a su servicio WCF, usted será capaz de encontrar su credenciales bajo

    ServiceSecurityContext.Current.WindowsIdentity 
    
  • si los usuarios autenticados con un certificado, encontrará su identidad (que va a ser un CertificateIdentity en lugar de una conexión inalámbrica ndowsIdentity) bajo

    ServiceSecurityContext.Current.PrimaryIdentity 
    

Dada una identidad Windows, también puede hacerse pasar por esa persona que llama para las llamadas subsiguientes hacia abajo en sus capas de negocio o de datos, si es necesario - echa un vistazo a la documentación de MSDN Delegation and Impersonation with WCF, o Google o Bing para La "Suplantación de WCF" debería proporcionarle una gran cantidad de enlaces valiosos sobre ese tema.

Si ni la ruta de Windows ni la del certificado funcionan para usted, WCF también le permite crear su propio esquema de autenticación personalizado, en cuyo caso necesitaría escribir una extensión para WCF, conectarlo, y usted obtenga el nombre de usuario/contraseña de la llamada que los usuarios le enviaron para validar contra cualquier tipo de tienda personalizada que pueda tener.

WCF le da un lote de muchas maneras: dudo mucho que encuentre un escenario que funcione en WSE3 pero que no funcione igual de bien (o mejor) en WCF.

+0

¡Fantástico, gracias! Esta es la información exacta que esperaba, por alguna razón, creo que me he perdido esto en la documentación. –

+0

Estoy tratando de poner esto en marcha también. Me gustaría ver que funcione en mi máquina local ejecutándose desde un cliente de prueba que también se ejecuta en mi máquina local. Configuré SSL y una configuración de enlace HTTPS adecuada (creo). Veo que el contexto actual es nulo y el contexto anónimo, aunque no es nulo, no tiene los valores que esperaba ya que el nombre de usuario es una cadena vacía. ¿Hay alguna configuración de IIS que deba modificar? – topwik

+0

repentinamente ServiceSecurityContext.Current.PrimaryIdentity está funcionando, ya no es nulo, y veo que el nombre de usuario esperado se escupió en las líneas de depuración, pero el depurador VS no depurará mi servidor web diciendo que algo no está configurado correctamente. – topwik

Cuestiones relacionadas