Redireccionar el usuario dependiendo del Rol desde Login webcontrol

Un funcionalidad requerida desde el webcontrol Login es la redireccion a partir de un rol especifico, ya sea porque unos amigos lo necesitaban o por algunas preguntas de la misma tematica en los grupos de noticias de asp.net

Vamos por lo que nos dice la razón, que es en el evento LoggedIn. Porque se ejecuta en este orden: LoggingIn, Authenticate y luego LoggedIn

Un ejemplo:

Protected Sub Login2_LoggedIn(ByVal sender As Object, ByVal e As System.EventArgs) Handles Login2.LoggedIn
       If User.IsInRole("MAESTROJEDI") = True Then
           Response.Redirect("~/admin/indexParaMAESTROJEDI.aspx")
       End If
   End Sub

Pero no funciono..!!
No encontramos en ningun lado porque no teniamos al usuario disponible (en el objeto User), ni tampoco de esta manera:    

Roles.IsUserInRole(Context.User.Identity.Name, "MAESTROJEDI")

Pareciera que cuando recien termina de armar la pagina se carga en la session y las cookies son enviadas a cliente….pero antes nada de nada

No nos ibamos a quedar de brazos cruzados, algo teniamos que hacer. Llegamos a dos soluciones que espero que sean de utilidad

OPCION 1: Pagina o Handler que sea te intermediario
Desde la página de login la enviamos en el mismo evento (LoggedIn) a otra pagina que alli podamos realizar esta sencilla pregunta de Roles

OPCION 2: Un poco… (artesanal) pero nos
Bueno dijimos entonces donde esta el usuario? y via MSN je en el textbox dentro del webcontrol Login y ya sabiamos que el usuairo se autentico
asi que solo nos quedaba recuperarlo:

Dim usuario As String = Login2.UserName
If Roles.IsUserInRole(usuario, "MAESTROJEDI") Then
    Response.Redirect("~/admin/indexParaMAESTROJEDI.aspx")
End If

OPCION 2.1:
Tambien lo puedes recuperar directamente del textbox que rederiza el webcontrol Login para el nombre de usuario con el id «Username»  

Dim txtUsername As TextBox = CType(Login2.FindControl("Username"), TextBox)
    Dim usuario As String = txtUsername.Text
    If Roles.IsUserInRole(usuario, "JEDIMASTER") Then
        Response.Redirect("~/admin/indexParaJEDIMASTER.aspx")
    End If

 

 

Enlaces

  • Login (Clase)
    Proporciona los elementos de la interfaz de usuario para iniciar sesión en un sitio Web.
  • Login.LoggingIn (Evento)
    Se produce cuando un usuario envía información de inicio de sesión, antes de que tenga lugar la autenticación.
  • Login.Authenticate (Evento)
    Aparece cuando se autentica un usuario.
  • Login.LoggedIn (Evento)
    Aparece cuando el usuario inicia sesión en el sitio Web y se ha autenticado.

VB4: "XAML, I am your father" (by Tom Hollander)

Interesante «correspondencia» entre XAML y los .FRM de los viejos (que aun utilizo) proyectos de VB6 en un post de Tom Hollander titulado VB4: «XAML, I am your father» . Lo capte al post rapidamente por dos cosas VB y la sugerencia a Startwars 😉
Hace un paralelismo entre estos dos diferentes tipos de metadata. No espero realizar un debate (ni con mis compañeros de trabajo) , ademas mas de una vez manipulamos estos archivos .frm, o .vbp de VB6 para arreglar alguna mala referencia, incluso en una oportunidad arreglando el un menu en VB6

También esto de definir formularios con xml como metadata ya habia testeado cuando jugaba con Flex y sus .mxml (en sus etapas beta) y me parecia bueno.. solo que la herramienta lo generaba cuando haciamos drag & drop era una separada Dreamweaver (parecido ya que se tomo como base esto mismo). Encima necesitaba ejecutar un sevidor de aplicaciones Java, asi que despues de las beta perdi el rastro de esta tecnología espero algun dia volver a utilizarla (si vuelve Soda Stereo porque yo no je!)

 

XAML VB5 MXML
<wf:Form x:Class="XamlWinForms.Window1"
    xmlns:x="http://schemas.microsoft.com
/winfx/2006/xaml"
    xmlns:wf="clr-namespace:System.Windows.Forms;
assembly=System.Windows.Forms"
    xmlns:sys="clr-namespace:System;
assembly=mscorlib"
    Text="Window1" Height="300" Width="300"
    >
  <wf:Form.Controls>
    <wf:Panel BackColor="#00FFFF" Dock="Fill"
BorderStyle="Fixed3D">
      <wf:Panel.Controls>
        <wf:Button Text="Click Me!"
Left="50" Top="50"
Width="100" Height="50"
Click="Button_Click">
</wf:Button>
        <wf:ListBox Top="120" Left="20">
          <wf:ListBox.Items>
            <sys:String>Foo</sys:String>
            <sys:String>Bar</sys:String>
          </wf:ListBox.Items>
      </wf:ListBox>
      </wf:Panel.Controls>
    </wf:Panel>
  </wf:Form.Controls>
</wf:Form>
VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Form1"
   ClientHeight    =   3090
   ClientLeft      =   60
   ClientTop       =   450
   ClientWidth     =   3690
   ForeColor       =   &H0000FFFF&
   LinkTopic       =   "Form1"
   MaxButton       =   0   'False
   ScaleHeight     =   3090
   ScaleWidth      =   3690
   StartUpPosition =   3  'Windows Default
   Begin VB.Timer Timer1 
      Interval        =   1000
      Left            =   3000
      Top             =   2280
   End
   Begin VB.CommandButton Command1 
      Caption         =   "Press to Play"
      BeginProperty Font 
         Name            =   "MS Sans Serif"
         Size            =   9.75
         Charset         =   0
         Weight          =   700
         Underline       =   0   'False
         Italic          =   0   'False
         Strikethrough   =   0   'False
      EndProperty
      Height          =   495
      Left            =   720
      MaskColor       =   &H008080FF&
      TabIndex        =   0
      Top             =   2400
      Width           =   2175
   End
   Begin VB.Shape Shape1 
      FillColor       =   &H000000FF&
      FillStyle       =   0  'Solid
      Height          =   615
      Index           =   8
      Left            =   2280
      Shape           =   5  'Rounded Square
      Top             =   1080
      Width           =   495
   End
End
<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx=
"http://www.macromedia.com/2003/mxml"> <mx:WebService id="wsStock" wsdl="http://services.xmethods.net/soap/
urn:xmethods-delayed-quotes.wsdl"> <mx:operation name="getQuote"> <mx:request> <symbol>{symbol.text}</symbol> </mx:request> </mx:operation> </mx:WebService> <mx:Label text="Enter a symbol:"/> <mx:HBox> <mx:TextInput id="symbol"/> <mx:Button label="Get Quote"
click='wsStock.getQuote.send()'/> </mx:HBox> <mx:Label id="quote"
fontWeight="bold"
text="{wsStock.getQuote.result}"/> </mx:Application>

 

Buscando en Geeks.ms (que comunidad…!) encontre este interesante post del elBruno
   –  Migrando de VB6 a WPF … the easy way !!!
      Donde nos comenta sobre VB6(2)WPF
Me imagino que hace una correspondecia de estas propiedades que tenemos mas arriba, pero bueno el que necesita tiene algo para testear 😉

Y una frase al final que me gustaria reproducir: «it’s nice to know that good ideas like this don’t die»

Capturar salida de un proceso: Ejemplo comandos básicos (ping, tracert, cmd /?, etc)

Más de una vez quisimos llamadar a un .bat y recuperar la salida para visualizarla desde una página, con ASP.NET 2.0 tenemos metodos que nos facilitan la vida.
Como me dedique a leer un poco quise dejarlo por aquí, por si alguien lo necesita.

Siempre empezamos con un ejemplo bien pero bien básico para ir creciendo, y poder realizar las tareas que realmente necesitamos. En este caso empezamos con un ping y luego seguimos con un tracert a geeks.ms y una ayuda de cmd.exe /?

Código

Private Sub Ejecutar()
      Dim strArgumentos As String = "127.0.0.1"
      Dim strExe As String = "ping"

      'Armar el proceso a ejecutar
      Dim startInfo As System.Diagnostics.ProcessStartInfo = New System.Diagnostics.ProcessStartInfo(strExe, strArgumentos)

      'Para poder manupular la salida indicamos que no se ejecute el shell
      startInfo.UseShellExecute = False

      'Por definicion (o mejor dicho codificacion) debemos ajustarnos a los que nos dice "San MSDN" 
      '(...)UseShellExecute debe ser true si se desea establecer ErrorDialog en true(...)
      startInfo.ErrorDialog = False

      'Sin ventana...
      startInfo.CreateNoWindow = True

      'Deseamos manipular la salida del proceso, para ello debemos establecer que se redirija la salida
      startInfo.RedirectStandardOutput = True

      Try
          Dim p As Diagnostics.Process = System.Diagnostics.Process.Start(startInfo)

          'Leemos la salida (objeto StreamReader)
          Dim sr As System.IO.StreamReader = p.StandardOutput
          Dim cadenaSalida As String = sr.ReadToEnd()
          sr.Close()

          'La visualizamos en el textbox. Un ejemplo basico ;)...
          TextBox1.Text = cadenaSalida
      Catch ex As Exception
          TextBox1.Text = (ex.Message)
      End Try


  End Sub

 

Ejemplo 1: Ping

Comando: «ping 127.0.0.1»

Dim strArgumentos As String = "127.0.0.1"
Dim strExe As String = "ping"

image

Y en la salida capturada y visualizada en el Textbox

image

 

Ejemplo 2: Tracert

Comando: «tracert www.geeks.ms»

Dim strArgumentos As String = "www.geeks.ms"
Dim strExe As String = "tracert"

image

Salida capturada

image

 

Ejemplo 3: Ayuda de cmd.exe /?

Comando: «cmd.exe /?»

Dim strArgumentos As String = "/?"
Dim strExe As String = "cmd.exe"

image

Y en la salida capturada y visualizada en el Textbox

image

 

Hasta aquí llego el ejemplo básico, espero sea la base para otras necesidades.
Como podemos capturar la salida del proceso, podremos manipularla/filtrarla a nuestro antojo.

 

Enlaces

  • Process.Start (Método) (ProcessStartInfo)
    Inicia el recurso de proceso que se especifica mediante el parámetro que contiene la información de inicio del proceso (por ejemplo, el nombre de archivo del proceso que se va a iniciar) y asocia el recurso a un nuevo componente Process.
  • ProcessStartInfo.UseShellExecute (Propiedad)
    Obtiene o establece un valor que indica si se va a usar el shell del sistema operativo para iniciar el proceso.
    • (…)Si se establece esta propiedad en false, es posible redirigir las secuencias de entrada, salida y error (…)
    • (…)El valor de UseShellExecute debe ser true si se establece el valor de la propiedad ErrorDialog en true.(…)
  • ProcessStartInfo.ErrorDialog (Propiedad)
    Obtiene o establece un valor que indica si se va a mostrar un cuadro de diálogo de error al usuario si el proceso no se puede iniciar.
    • nuevamente: (…)UseShellExecute debe ser true si se desea establecer ErrorDialog en true(…)
  • ProcessStartInfo.CreateNoWindow (Propiedad)
    Obtiene o establece un valor que indica si el proceso se va a iniciar en una nueva ventana.
  • ProcessStartInfo.RedirectStandardOutput (Propiedad)
    Obtiene o establece un valor que indica si el resultado de una aplicación se escribe en la secuencia de Process.StandardOutput.
    • (…)Cuando un Process escribe texto en la secuencia estándar, dicho texto se muestra normalmente en la consola. Si se redirige la secuencia de StandardOutput, se puede manipular o suprimir el resultado de un proceso(…)
    • (…)Es preciso establecer el valor de UseShellExecute en false si se desea establecer el valor de RedirectStandardOutput en true. De lo contrario, al leer la secuencia de StandardOutput, se produce una excepción.(…)
  • Process.StandardOutput (Propiedad)
    Obtiene una secuencia utilizada para leer la salida de la aplicación.