Depurador y CurrentPrincipal

16/01/2006 - 19:25 por AOG | Informe spam
hola, tengo un par de dudas

1º duda:
tego una solucion en VB 2005 final, formado por 4 proyecto 1º es la capa de
IU (Interfaz de Usuario), 2º un SW (Servico Web), 3º es la capa de negoacio y
4º Acceso a datos.
la solucion está en modo Debug, y pregunto por qué, y son muy poca veces, me
funciona ir depurando (interpretando)las líneas de código pasa por paso (F8)
empezando por el proyecto IU y me pasa al proyecto SW y sigue interpretando
linea por linea para ver el
conportamiento en la capa de negocio, y en la mayoria de veces
no me deja depurar, es decir se queda en el proyecto IU y no sigue
interpretando las
lineas de los demas proyectos, continuando en la siguiente linea del
poryecto IU, una vez
terminado la llamada al método del servico Web, vamos que no interpreta
paso a paso por lo demás proyecto. ¿Tengo algo mal configurado en mi VS?

2º duda
Otra cuestion es si desde la capa IU se hace una llamada un metodo del SW
el Thread.CurrentPrincipal es el mimo o conserva los mismos valores en todas
las llamadas,
hasque que se cambie en ese hilo de ejecusion. Lo digo por la seguridad ya
que tengo hecho
que en cada llamada de un metodo del SW la primera línea es recoger el
usuario y contraseña
de la cabecera SOAP y llamar a una funcion que si ha cambiado el
Thread.CurrentPrincipal.Identity.Name vuelvo
a buscar el usuario en la base de datos y comparar el que se pasa por la
cabecera
y permitirá o denegará continuar ejecutando el metodo si el usuario es
válido, si es
valido asigno el usuairo de la cabecera SAOP al
Thread.CurrentPrincipal.Identity
y en el caso que Thread.CurrentPrincipal.Identity.Name
es igual a la de la cabecera no busco en la BBDD y me ahorro acceder a la
BBDD.

Public Function ValidarUsuario(UsuarioActivo_CabSOAP,ClaveActivo_CabSOAP) as
Booleand
if Thread.CurrentPrincipal.Identity.Name <> UsuarioActivo_CabSOAP Then
dsUsu = BuscarUsuarioEnBBDD(UsuarioActivo_CabSOAP)
if dsUsu.Rows(0).Codigo = UsuarioActivo_CabSOAP and dsUsu.Rows(0).Clave =
ClaveActivo_CabSOAP then
AsignarNuevoUsuairoCurrentPrincipal(UsuarioActivo_CabSOAP)
return = true
else
return = false
end if
Else
return true
End if
End Function
¡Claro!, esto me sirve si conserva Thread.CurrentPrincipal.Identity.Name en
todas las llamadas
, en el caso que no, siempre estaría buscando en la BBDD, lo cual el
rendimiento será peor.
Si se accede directamente desde la IU a la capa de negocio si es el mismo
Hilo, pero cuando
hay un SW por medio, ignoro el comportamiento.

Lo que se trata de guardar el usuario activo en el SW para compara con el
que se pasa en
la cabecera SOAP cuando se llama a un metodo del dicho SW.
Si alguien me puede aportar una sugerencia mejor sobre este tema de
seguridad, se lo agradecería mucho.

Por favor, me gustaria que me despejarais estas dos dudas, un saludo.

Preguntas similare

Leer las respuestas

#1 AOG
17/01/2006 - 12:03 | Informe spam
Hola Jesús, gracias por tu aportación.
Yo había probado también lo de poner un breakpoint en el metodo que llamo
del SW, pero no me hace la parada, tendrás otra configuración que te hace que
se te pare o simplemente tú tienes más suerte que yo.

Con respecto a la auteticasión, tienes razón, he comprobado pasando a un
archivo txt el Thread.CurrentPrincipal.Identity.Name (usuario) cuando hago
la llamada al metodo del SW y la devuelve vacia (esta es la manera que se me
ha ocurrido para ver dicho valor ya que no me fuciona lo de paso a paso) , si
se lo asigno dentro del SW si que lo mantiene en las llamadas (dentro) de la
capa de negocio, al volver a llamar un método del SW está de nuevo vacia y
tengo que volver asignar el usuario al hilo (Thread). He visto que utilizas
sw.Credentials, no se como funciona esto, pero me parece interesante, yo
puedo obtener los credenciales dentro de un metodo del SW los cuales se han
asignado en la capa IU, es decir, comprobar dichas credenciales) Usuario,
clave desde SW. ¿Cómo? ya que dentro del metodo del SW no existe algo
Me.Credentials, vamos que yo suponía que se accedía así.

Un saludo.


"Jesús Villalobos" escribió:

Tu primera duda:

A mí también me pasaba, es curioso, quizás sea un bug del IDE. Lo solucioné
(es un decir) poniendo un breakpoint DENTRO del SW, por ejemplo en la
primera línea ejecutable del método que quiero depurar. Entonces se para
siempre ahí y puedes depurar normalmente.

Tu segunda duda no acabo de entenderla. Cuando estableces la autenticación a "Acceso anónimo" en el SW desde luego el Principal no contiene ningún usuario. Si la estableces a "Autenticacion Windows Integrada" que es como supongo que la tienes, has de enviar las credenciales junto con la petición al SW. por ejemplo, en este caso utilizo las credenciales del usuario que ha hecho login en la máquina:

Dim sw As New localhost.Service

sw.Url = Me.TextBox1.Text

sw.Credentials = System.Net.CredentialCache.DefaultCredentials

MessageBox.Show(sw.HelloWorld())

Puedes crear un nuevo objeto Credentials, ponerle el usuario y password que quieras y enviarlo en la petición. En cualquier caso, el Principal que contendrá la llamada será siempre el de las credentials que hayas utilizado. En el caso anterior, si la petición se hace desde diferentes equipos en los que han hecho login diferentes usuarios, el contenido del Principal será el del usuario que haya hecho login en cada máquina. No acabo de ver tu problema.



"AOG" escribió en el mensaje
news:
> hola, tengo un par de dudas
>
> 1º duda:
> tego una solucion en VB 2005 final, formado por 4 proyecto 1º es la capa
> de
> IU (Interfaz de Usuario), 2º un SW (Servico Web), 3º es la capa de
> negoacio y
> 4º Acceso a datos.
> la solucion está en modo Debug, y pregunto por qué, y son muy poca veces,
> me
> funciona ir depurando (interpretando)las líneas de código pasa por paso
> (F8)
> empezando por el proyecto IU y me pasa al proyecto SW y sigue
> interpretando
> linea por linea para ver el
> conportamiento en la capa de negocio, y en la mayoria de veces
> no me deja depurar, es decir se queda en el proyecto IU y no sigue
> interpretando las
> lineas de los demas proyectos, continuando en la siguiente linea del
> poryecto IU, una vez
> terminado la llamada al método del servico Web, vamos que no interpreta
> paso a paso por lo demás proyecto. ¿Tengo algo mal configurado en mi VS?
>
> 2º duda
> Otra cuestion es si desde la capa IU se hace una llamada un metodo del SW
> el Thread.CurrentPrincipal es el mimo o conserva los mismos valores en
> todas
> las llamadas,
> hasque que se cambie en ese hilo de ejecusion. Lo digo por la seguridad ya
> que tengo hecho
> que en cada llamada de un metodo del SW la primera línea es recoger el
> usuario y contraseña
> de la cabecera SOAP y llamar a una funcion que si ha cambiado el
> Thread.CurrentPrincipal.Identity.Name vuelvo
> a buscar el usuario en la base de datos y comparar el que se pasa por la
> cabecera
> y permitirá o denegará continuar ejecutando el metodo si el usuario es
> válido, si es
> valido asigno el usuairo de la cabecera SAOP al
> Thread.CurrentPrincipal.Identity
> y en el caso que Thread.CurrentPrincipal.Identity.Name
> es igual a la de la cabecera no busco en la BBDD y me ahorro acceder a la
> BBDD.
>
> Public Function ValidarUsuario(UsuarioActivo_CabSOAP,ClaveActivo_CabSOAP)
> as
> Booleand
> if Thread.CurrentPrincipal.Identity.Name <> UsuarioActivo_CabSOAP Then
> dsUsu = BuscarUsuarioEnBBDD(UsuarioActivo_CabSOAP)
> if dsUsu.Rows(0).Codigo = UsuarioActivo_CabSOAP and dsUsu.Rows(0).Clave > > ClaveActivo_CabSOAP then
> AsignarNuevoUsuairoCurrentPrincipal(UsuarioActivo_CabSOAP)
> return = true
> else
> return = false
> end if
> Else
> return true
> End if
> End Function
> ¡Claro!, esto me sirve si conserva Thread.CurrentPrincipal.Identity.Name
> en
> todas las llamadas
> , en el caso que no, siempre estaría buscando en la BBDD, lo cual el
> rendimiento será peor.
> Si se accede directamente desde la IU a la capa de negocio si es el mismo
> Hilo, pero cuando
> hay un SW por medio, ignoro el comportamiento.
>
> Lo que se trata de guardar el usuario activo en el SW para compara con el
> que se pasa en
> la cabecera SOAP cuando se llama a un metodo del dicho SW.
> Si alguien me puede aportar una sugerencia mejor sobre este tema de
> seguridad, se lo agradecería mucho.
>
> Por favor, me gustaria que me despejarais estas dos dudas, un saludo
Respuesta Responder a este mensaje
#2 Jesús Villalobos
17/01/2006 - 17:23 | Informe spam
Lo único que se me ocurre para tu problema de depuración es que no tengas
asignada la entrada en el web.config del SW. El mío pone

<system.web>
<!--
Set compilation debug="true" to insert debugging
symbols into the compiled page. Because this
affects performance, set this value to true only
during development.

Visual Basic options:
Set strict="true" to disallow all data type conversions
where data loss can occur.
Set explicit="true" to force declaration of all variables.
<compilation debug="true" strict="false" explicit="true"/>


El segundo punto: Como te dije en el mensaje, para que te funcionen las
Credentials tienes que cambiar el modo de autenticación a "Windows
integrada". El código que te envié en el anterior mensaje es el código de
cliente, el que has de poner en el programa que acceda al SW. Desde el SW lo
único que tienes que hacer es acceder al
Thread.CurrentPrincipal.Identity.Name tal y como lo haces ahora. Al cargar
las credenciales el Principal del Thread del SW toma los valores de las
credenciales que hayas puesto. Como cada usuario enviará las suyas (si
utilizas las DefaultCredentials), en cada llamada tendrás un Identity.Name
que se corresponda con el usuario que ha hecho la llamada. Es posible crear
un conjunto nuevo y personalizado de Credentials (distinto del usuario que
ha hecho login en la máquina, un usuario especial, por ejemplo) y
asignarselo al SW en la capa IU.

Piensa que en el momento en que estableces la autenticaciòn a "Windows
integrada" es OBLIGATORIO que cargues las Credentials en el SW antes de
llamar al método, y que sean válidas, de lo contrario te dará AccesDenied.


Jesús Villalobos
Responsable de desarrollo
Consultoría Certia



"AOG" escribió en el mensaje
news:
Hola Jesús, gracias por tu aportación.
Yo había probado también lo de poner un breakpoint en el metodo que llamo
del SW, pero no me hace la parada, tendrás otra configuración que te hace
que
se te pare o simplemente tú tienes más suerte que yo.

Con respecto a la auteticasión, tienes razón, he comprobado pasando a un
archivo txt el Thread.CurrentPrincipal.Identity.Name (usuario) cuando
hago
la llamada al metodo del SW y la devuelve vacia (esta es la manera que se
me
ha ocurrido para ver dicho valor ya que no me fuciona lo de paso a paso) ,
si
se lo asigno dentro del SW si que lo mantiene en las llamadas (dentro) de
la
capa de negocio, al volver a llamar un método del SW está de nuevo vacia y
tengo que volver asignar el usuario al hilo (Thread). He visto que
utilizas
sw.Credentials, no se como funciona esto, pero me parece interesante, yo
puedo obtener los credenciales dentro de un metodo del SW los cuales se
han
asignado en la capa IU, es decir, comprobar dichas credenciales) Usuario,
clave desde SW. ¿Cómo? ya que dentro del metodo del SW no existe algo
Me.Credentials, vamos que yo suponía que se accedía así.

Un saludo.


"Jesús Villalobos" escribió:

Tu primera duda:

A mí también me pasaba, es curioso, quizás sea un bug del IDE. Lo
solucioné
(es un decir) poniendo un breakpoint DENTRO del SW, por ejemplo en la
primera línea ejecutable del método que quiero depurar. Entonces se para
siempre ahí y puedes depurar normalmente.

Tu segunda duda no acabo de entenderla. Cuando estableces la
autenticación a "Acceso anónimo" en el SW desde luego el Principal no
contiene ningún usuario. Si la estableces a "Autenticacion Windows
Integrada" que es como supongo que la tienes, has de enviar las
credenciales junto con la petición al SW. por ejemplo, en este caso
utilizo las credenciales del usuario que ha hecho login en la máquina:

Dim sw As New localhost.Service

sw.Url = Me.TextBox1.Text

sw.Credentials = System.Net.CredentialCache.DefaultCredentials

MessageBox.Show(sw.HelloWorld())

Puedes crear un nuevo objeto Credentials, ponerle el usuario y password
que quieras y enviarlo en la petición. En cualquier caso, el Principal
que contendrá la llamada será siempre el de las credentials que hayas
utilizado. En el caso anterior, si la petición se hace desde diferentes
equipos en los que han hecho login diferentes usuarios, el contenido del
Principal será el del usuario que haya hecho login en cada máquina. No
acabo de ver tu problema.



"AOG" escribió en el mensaje
news:
> hola, tengo un par de dudas
>
> 1º duda:
> tego una solucion en VB 2005 final, formado por 4 proyecto 1º es la
> capa
> de
> IU (Interfaz de Usuario), 2º un SW (Servico Web), 3º es la capa de
> negoacio y
> 4º Acceso a datos.
> la solucion está en modo Debug, y pregunto por qué, y son muy poca
> veces,
> me
> funciona ir depurando (interpretando)las líneas de código pasa por paso
> (F8)
> empezando por el proyecto IU y me pasa al proyecto SW y sigue
> interpretando
> linea por linea para ver el
> conportamiento en la capa de negocio, y en la mayoria de veces
> no me deja depurar, es decir se queda en el proyecto IU y no sigue
> interpretando las
> lineas de los demas proyectos, continuando en la siguiente linea del
> poryecto IU, una vez
> terminado la llamada al método del servico Web, vamos que no interpreta
> paso a paso por lo demás proyecto. ¿Tengo algo mal configurado en mi
> VS?
>
> 2º duda
> Otra cuestion es si desde la capa IU se hace una llamada un metodo del
> SW
> el Thread.CurrentPrincipal es el mimo o conserva los mismos valores en
> todas
> las llamadas,
> hasque que se cambie en ese hilo de ejecusion. Lo digo por la seguridad
> ya
> que tengo hecho
> que en cada llamada de un metodo del SW la primera línea es recoger el
> usuario y contraseña
> de la cabecera SOAP y llamar a una funcion que si ha cambiado el
> Thread.CurrentPrincipal.Identity.Name vuelvo
> a buscar el usuario en la base de datos y comparar el que se pasa por
> la
> cabecera
> y permitirá o denegará continuar ejecutando el metodo si el usuario es
> válido, si es
> valido asigno el usuairo de la cabecera SAOP al
> Thread.CurrentPrincipal.Identity
> y en el caso que Thread.CurrentPrincipal.Identity.Name
> es igual a la de la cabecera no busco en la BBDD y me ahorro acceder a
> la
> BBDD.
>
> Public Function
> ValidarUsuario(UsuarioActivo_CabSOAP,ClaveActivo_CabSOAP)
> as
> Booleand
> if Thread.CurrentPrincipal.Identity.Name <> UsuarioActivo_CabSOAP Then
> dsUsu = BuscarUsuarioEnBBDD(UsuarioActivo_CabSOAP)
> if dsUsu.Rows(0).Codigo = UsuarioActivo_CabSOAP and dsUsu.Rows(0).Clave
> >> > ClaveActivo_CabSOAP then
> AsignarNuevoUsuairoCurrentPrincipal(UsuarioActivo_CabSOAP)
> return = true
> else
> return = false
> end if
> Else
> return true
> End if
> End Function
> ¡Claro!, esto me sirve si conserva
> Thread.CurrentPrincipal.Identity.Name
> en
> todas las llamadas
> , en el caso que no, siempre estaría buscando en la BBDD, lo cual el
> rendimiento será peor.
> Si se accede directamente desde la IU a la capa de negocio si es el
> mismo
> Hilo, pero cuando
> hay un SW por medio, ignoro el comportamiento.
>
> Lo que se trata de guardar el usuario activo en el SW para compara con
> el
> que se pasa en
> la cabecera SOAP cuando se llama a un metodo del dicho SW.
> Si alguien me puede aportar una sugerencia mejor sobre este tema de
> seguridad, se lo agradecería mucho.
>
> Por favor, me gustaria que me despejarais estas dos dudas, un saludo
Respuesta Responder a este mensaje
#3 AOG
18/01/2006 - 14:21 | Informe spam
Hola de nuevo Jesús,
Respecto al primer punto tengo lo mismo que tú en el web.config del SW, de
todas maneras me han dicho en otro foro como puedo hacerlo de otra manero
para que se pare en el BREAK-POINTS del SW y me funciona, te la remito:
Para hacer Debugging del WebService o de los objetos de
negocio, tienes que hacer un "ATTACH TO PROCESS" al proceso del Servidor Web
que utilices. Se hace desde Visual Studio 2005, en :
Debug-->Attach to Process. Y ¿A que proceso concretamente?, pues depende del
Servidor Web que utilices:
1.- Mini-Servidor Web integrado en VS.2005 (llamado Cassini) --> proceso
"WebDev.WebServer.EXE"
2.- Servidor Web IIS de Windows XP, en el proceso del pool de WebSites por
defecto: --> proceso "aspnet_wp.exe"
3.- Servidor Web IIS de Windows Server 2003, en el proceso del pool de
WebSites por defecto: --> proceso "w3wp.exe".
Y VS.2005 queda 'esperando' en modo DEBUGGING.
Después arranca la aplicación cliente SIN DEBUGGING, haciendo doble clic
directamente en el .EXE, y cuando llame al WebService, VS.2005 se parará en
los BREAK-POINTS que hayas puesto en el WebSerevice o en los componentes de
negocio.

En el segundo punto aun no logro que me funcione sw.Credentials, yo creo que
el modo de autenticación es "Windows > integrada", ya que en el archivo
Web.Config tengo esta línea <authentication mode="Windows"/>.


Esto lo que hago en la IU :
SWGestorMamatenimiento.Credentials =
System.Net.CredentialCache.DefaultCredentials
Tambien he probado con esto, asignar el usario y clave directamente:
SWGestorMamatenimiento.Credentials = New Net.NetworkCredential(usuario,
clave)

Nota: SWGestorMamatenimiento es la instacia del SW en la IU

... y cuando se hace la parada BREAK-POINTS (ya si puedo hacer dicha parada
con lo que te he comentado) en el metodo del SW hago esto para comprobar
que usuario hay:

<WebMethod(), SoapHeader("HeaderUsuario",
direction:=SoapHeaderDirection.InOut)> _
Public Function Autenticacion() As Boolean
Dim s As String = Thread.CurrentPrincipal.Identity.Name
End Function

y la variable es blanco (""), vamos que no tiene asignado un usuario asignado
¿He hecho algo mal? , seguro que sí
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida