with usernamepasswordvalidator seguridad clientcredentialtype wcf silverlight-3.0 passwords credentials

usernamepasswordvalidator - wcf with credentials



WCF+credenciales de usuario (3)

Estoy trabajando en una aplicación web Silverlight v3 y me gustaría asegurar el acceso al servicio WCF que estoy usando para buscar mis datos. Actualmente tengo el WCF funcionando bien, pero no requiere credenciales de usuario.

No tengo mucha experiencia con este aspecto de WCF, así que mi primera idea fue agregar parámetros de nombre de usuario y contraseña a cada una de las operaciones de mi servicio. El problema que tengo con esto es que esto requeriría una gran cantidad de código redundante, y el hecho de que el nombre de usuario y la contraseña se transferirían a través del cable en texto plano.

Lo que me gustaría es una forma de especificar las credenciales por adelantado en el lado del cliente justo después de crear mi proxy de servicio (estoy usando el proxy autogenerado desde "Agregar referencia de servicio").

Al buscar en Google una solución para esto, solo pude encontrar soluciones similares a mi primera idea (usando los parámetros de nombre de usuario / contraseña). ¿Podría alguien señalarme en la dirección correcta?

¡Gracias!


No enrolles el tuyo y añada parámetros explícitos; ¡de hecho, es demasiado trabajo!

Eche un vistazo a las características de seguridad de WCF, ¡hay muchas disponibles! Por ejemplo, puede proteger el mensaje e incluir credenciales dentro del mensaje; ¡todo listo, no se requiere codificación adicional de su lado!

Vea este excelente artículo sobre la seguridad de WCF por Michele Leroux Bustamante: http://www.devx.com/codemag/Article/33342

En su caso, sugeriría seguridad de mensajes con credenciales de nombre de usuario; debe configurar esto en ambos extremos:

Lado del servidor:

<bindings> <basicHttpBinding> <binding name="SecuredBasicHttp" > <security mode="Message"> <message clientCredentialType="UserName"/> </security> </binding> </basicHttpBinding> </bindings> <services> <service name="YourService"> <endpoint address="http://localhost:8000/MyService" binding="basicHttpBinding" bindingConfiguration="SecuredBasicHttp" contract="IYourService" /> </service> </services>

Y debe aplicar la misma configuración en el lado del cliente:

<bindings> <basicHttpBinding> <binding name="SecuredBasicHttp" > <security mode="Message"> <message clientCredentialType="UserName"/> </security> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="http://localhost:8000/MyService" binding="basicHttpBinding" bindingConfiguration="SecuredBasicHttp" contract="IYourService" /> </client>

Ahora su servidor y su cliente acuerdan la seguridad: en el cliente, usted debe especificar el nombre de usuario y la contraseña para usarlos así:

YourServiceClient client = new YourServiceClient(); client.ClientCredentials.UserName.UserName = "your user name"; client.ClientCredentials.UserName.Password = "top$secret";

En el lado del servidor, deberá configurar cómo se validan estas credenciales de usuario, generalmente contra un dominio de Windows (Active Directory) o contra el modelo de proveedor de membresía de ASP.NET. En cualquier caso, si las credenciales del usuario no se pueden verificar contra esa tienda que usted defina, la llamada será rechazada.

Espero que esto ayude un poco - la seguridad es un gran tema en WCF y tiene muchas y muchas opciones - puede ser un poco desalentador, pero al final, ¡generalmente tiene sentido! :-)

Bagazo


puede pasar algún tipo de objeto de autenticación y cifrarlo en el nivel de mensaje con WCF. Los aspectos de C # ( http://www.postsharp.org/ ) se pueden usar para evitar la lógica redundante. Es una forma muy limpia de manejarlo.


¿De dónde vienen estos nombres de usuario y contraseñas? Si su sitio web ya implementa la autenticación de Formularios, puede omitir el establecimiento de credenciales usted mismo y usar la cookie de autenticación de formularios. Si sus usuarios han iniciado sesión, la cookie viajará con la llamada al servicio web. Para leerlo del otro lado, necesitas hacer un par de cambios.

Primero debe habilitar el modo de compatibilidad ASP.NET para WCF en la sección system.ServiceModel:

<system.serviceModel> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> </system.serviceModel>

Una vez hecho esto, para cada método de servicio que desee comprender, la cookie ASP.NET agrega el atributo [AspNetCompatibilityRequirements] a su clase de servicio.

[ServiceContract] [AspNetCompatibilityRequirements( RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class ExampleService { }

Ahora dentro de cada método puede acceder al objeto HttpContext.Current.User.Identity para descubrir la identidad del usuario.

Si solo quiere que ciertos métodos sean llamados por usuarios autenticados, entonces puede usar una PrincipalPermission por lo tanto

[OperationContract] [PrincipalPermission(SecurityAction.Demand, Authenticated=true)] public string Echo()

Como beneficio adicional si usa el proveedor de roles de ASP.NET, estos también se completarán y podrá utilizar unaPermission de Principal sobre los métodos para limitarlos a los miembros de un rol en particular:

[OperationContract] [PrincipalPermission(SecurityAction.Demand, Role="Administators")] public string NukeTheSiteFromOrbit()

Y esto también funciona en Silverlight2.