Exportar (0) Imprimir
Expandir todo

Inicio de sesión

Visual Studio .NET 2003

Para que un usuario pueda administrar una cuenta o realizar una compra, primero debe iniciar una sesión en Duwamish 7.0 mediante un proceso de inicio de sesión con el que está familiarizado. La página de inicio de sesión utiliza la autenticación por formularios de ASP.NET para validar a los usuarios que suministren un alias de correo electrónico único y una contraseña. Si un usuario no ha establecido una cuenta, para crearla puede hacer clic en el botón Nuevo cliente. Para obtener información detallada sobre cómo crear una cuenta nueva, vea Administración de cuentas.

Implementación

La página Inicio de sesión utiliza los siguientes archivos de ASP.NET y de código subyacente de C# o Visual Basic .NET:

  • Logon.aspx
  • Logon.aspx.cs
  • Logon.aspx.vb
    Nota   Para obtener más información sobre el código subyacente de ASP.NET, vea Crear aplicaciones Web ASP.NET.

Información general sobre el proceso

El proceso de inicio de sesión se inicia en la capa Web. Un usuario escribe una dirección de correo electrónico y una contraseña (credenciales) y, a continuación, hace clic en el botón Inicio de sesión, que llama al método Duwamish7.Web.Logon.LogonButton_Click. A continuación, el método Duwamish7.Web.Logon.LogonButton_Click crea una representación hash de la contraseña y pasa las credenciales al método Duwamish7.BusinessFacade.CustomerSystem.GetCustomerByEmail de la capa Business Facade. Después, el método Duwamish7.DataAccess.Customers.LoadCustomerByEmail llama a la capa Data Access que, a su vez, llama al procedimiento almacenado (SPROC) GetCustomerByEmail. Entonces se comprueba la contraseña a la que se le han aplicado algoritmos hash con la contraseña a la que se le han aplicado algoritmos hash y salt devuelta por el método ComparePasswords desde la base de datos. Si los credenciales son válidos, la información de la cuenta del cliente se almacena correctamente en el objeto Cart y la Autenticación por formularios de ASP.NET valida los credenciales a través de la propiedad ShoppingCart.Customer() de la clase pageBase. Si los credenciales no son válidos, MismatchLabel se establece en visible y, en consecuencia, se muestra el siguiente mensaje en la página ASP.NET: "Invalid email address or password - please try again".

Nota   Para obtener más información acerca de cómo aplicar algoritmos salt y hash a contraseñas, vea Protección de credencial de contraseña.

Para buscar código fuente que se pueda aplicar a capas específicas en este tema, haga clic en el vínculo adecuado:

Código fuente de Business Facade | Código fuente de Data Access | SPROC

Código fuente Web

De manera predeterminada, el código fuente del método Duwamish7.Web.Logon.LogonButton_Click está ubicado en el archivo: [Letra de la unidad en la que esté instalado Visual Studio.NET]:\Archivos de programa\Microsoft Visual Studio .NET 2003\Enterprise Samples\Duwamish 7.0 CS\Web\Secure\Logon.aspx.cs.

Nota   Si está instalada la versión Visual Basic .NET, en la ruta de acceso reemplace Duwamish 7.0 CS por Duwamish 7.0 VB y la extensión cs por la extensión vb; el nombre del archivo es el mismo.

Método Duwamish7.Web.Logon.LogonButton_Click:

[C#]
/// <summary>
///     Validates a logon attempt  saves off the customer account information.
///     <param name="sender">The source of the event.</param>
///     <param name="e">An EventArgs that contains the event data.</param>
/// </summary>
public void LogonButton_Click(Object sender, EventArgs e)
{
    CustomerData custData;

    //
    // Check the Email and Password
    //
    MismatchLabel.Visible = false;

    //Validator controls make sure Email and Password exist
    if (!Page.IsValid)
    {
        return;
    }
    
    //
    // Check for already logged on
    //
    if (logonCustomerData != null)
    {
        ShowPanel(LogonPanel, false);
        ShowPanel(DetailsPanel, false);
        ShowPanel(CreatedPanel, false);
        ShowPanel(LoggedOnPanel, true);
        ViewState["target"] = "logon";
        return;
    }

    //
    // Ensure the right panel == visible
    //
    ShowPanel(LogonPanel, true);
    ShowPanel(LoggedOnPanel, false);
    ShowPanel(DetailsPanel, false);
    ShowPanel(CreatedPanel, false);

    //
    // Check the Email and Password combination
    //
    SHA1 sha1 = SHA1.Create();
    byte [] password = sha1.ComputeHash(Encoding.Unicode.GetBytes(LogonPasswordTextBox.Text));

    custData = (new CustomerSystem()).GetCustomerByEmail(LogonEmailTextBox.Text, password);            
    if (custData != null)   //were they valid?
    {
        //
        // 1. Update customer in session.
        // 2. Update customer in cart. 
        //
        base.Customer = custData;
        base.ShoppingCart().Customer = custData;
        FormsAuthentication.RedirectFromLoginPage("*", false);
    }
    else
    {
        MismatchLabel.Visible = true;
    }        
}
[Visual Basic .NET]
'----------------------------------------------------------------
' Sub LogonButton_Click:
'   Validates a logon attempt then saves off the customer account information.
' Parameters:
'   [in] sender: Standard onlcick parameter for the sending object
'   [in] e: Standard click parameter for the event arguments
'----------------------------------------------------------------
Private Sub LogonButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim custData As CustomerData

    '
    ' Check the Email and Password
    '
    MismatchLabel.Visible = False

    '
    'Validator controls make sure Email and Password exist
    '
    If Not Page.IsValid Then 
        Return
    End If
    
    '
    ' Check for already logged on
    '
    If Not logonCustomerData Is Nothing Then
        ShowPanel(LogonPanel, False)
        ShowPanel(DetailsPanel, False)
        ShowPanel(CreatedPanel, False)
        ShowPanel(LoggedOnPanel, True)
        Me.ViewState("target") = "logon"
        Exit Sub
    End If
    '
    ' Ensure the right panel is visible
    '
    ShowPanel(LogonPanel, True)
    ShowPanel(LoggedOnPanel, False)
    ShowPanel(DetailsPanel, False)
    ShowPanel(CreatedPanel, False)
                
    '
    ' Check the Email and Password combination
    ' 
    With New CustomerSystem()
         ' <A href=viewsource.aspx?Title=CustomerSystem.vb&FilePath=../Business/Facade/CustomerSystem.vb>CustomerSystem.GetCustomerByEmail()</A>
         Dim sha1 As SHA1 = SHA1.Create()
         Dim password As byte() = sha1.ComputeHash(Encoding.Unicode.GetBytes(LogonPasswordTextBox.Text))

         custData = .GetCustomerByEmail(LogonEmailTextBox.Text, password)
    End With
    If Not custData Is Nothing Then  'were they valid?
        '
        ' 1. Update customer in session.
        ' 2. Update customer in cart. 
        '
        MyBase.Customer = custData
        MyBase.ShoppingCart.Customer = custData
        FormsAuthentication.RedirectFromLoginPage("*",false)
    Else
        MismatchLabel.Visible = True
    End If        
End Sub

Código fuente de Business Facade

De manera predeterminada, el código fuente del método Duwamish7.BusinessFacade.CustomerSystem.GetCustomerByEmail está ubicado en el archivo: [Letra de la unidad en la que esté instalado Visual Studio.NET]:\Archivos de programa\Microsoft Visual Studio .NET 2003\Enterprise Samples\Duwamish 7.0 CS\Business\Facade\CustomerSystem.cs.

Nota   Si está instalada la versión Visual Basic .NET, en la ruta de acceso reemplace Duwamish 7.0 CS por Duwamish 7.0 VB y la extensión cs por la extensión vb; el nombre del archivo es el mismo.

Método Duwamish7.BusinessFacade.CustomerSystem.GetCustomerByEmail:

[C#]
/// <summary>
///     Retrieve a customer given the customer's email and password.
///     <param name="emailAddress">Customer's email address.</param>
///     <param name="password">Customer's account password.</param>
///     <retvalue>The customer or null.</retvalue>
///     <exception> class='System.ApplicationException'>
///         The emailAddress or password is blank.
///     </exception>
/// </summary>
public CustomerData GetCustomerByEmail(String emailAddress, byte [] password)
{
   //
   // Check preconditions
   //
   ApplicationAssert.CheckCondition(emailAddress != String.Empty, "Email address is required", ApplicationAssert.LineNumber);
   ApplicationAssert.CheckCondition(password.Length != 0, "Password is required", ApplicationAssert.LineNumber);
   //
   // Get the customer dataSet
   //
   CustomerData dataSet;
   using (DataAccess.Customers customersDataAccess = new DataAccess.Customers())
   {
      dataSet = customersDataAccess.LoadCustomerByEmail(emailAddress);
   }
   //    
   // Verify the customer's password
   //
   DataRowCollection rows = dataSet.Tables[CustomerData.CUSTOMERS_TABLE].Rows;

   if ( ( rows.Count == 1 ))
   {
      byte [] dbPassword = (byte[])rows[0][CustomerData.PASSWORD_FIELD];

      if (ComparePasswords (dbPassword, password))
         return dataSet;
      else
         return null;
   }
   else
      return null;
[Visual Basic .NET]
'----------------------------------------------------------------
' Function GetCustomerByEmail:
'   Retrieve a customer given the customer's email and password.
' Returns:
'   The customer or Nothing
' Parameters:
'   [in]  emailAddress: Customer's email address
'   [in]  password: Customer's account password
' Throws:
'   PreConditionException
' PreConditions:
'   emailAddress or password is blank
'----------------------------------------------------------------
Public Function GetCustomerByEmail(ByVal emailAddress As String, ByVal password As byte()) As CustomerData
    
    '
    ' Check preconditions
    '
    ApplicationAssert.CheckCondition( Len(emailAddress) > 0, "Email address is required", ApplicationAssert.LineNumber)
    ApplicationAssert.CheckCondition( password.Length > 0, "Password is required", ApplicationAssert.LineNumber)
    
    Dim dataSet As CustomerData ' used manipulate CustomerData
    
    '  
    ' Get the customer dataSet
    '
    With New DataAccess.Customers
         dataSet = .LoadCustomerByEmail(emailAddress)
    End With 

    '
    ' Verify the customer's password
    '
    With dataSet.Tables(CustomerData.CUSTOMERS_TABLE).Rows
        If (.Count = 1)  Then
            Dim dbPassword As byte() 
            dbPassword = CType(.Item(0).Item(CustomerData.PASSWORD_FIELD), byte())
            If (ComparePasswords(dbPassword, password)) Then
                GetCustomerByEmail = dataSet
            End If
        End If
    End With
    
End Function

Código fuente de Data Access

De manera predeterminada, el código fuente del método Duwamish7.DataAccess.Customers.LoadCustomerByEmail está ubicado en el archivo: [Letra de la unidad en la que esté instalado Visual Studio.NET]:\Archivos de programa\Microsoft Visual Studio .NET 2003\Enterprise Samples\Duwamish 7.0 CS\DataAccess\Customers.cs.

Nota   Si está instalada la versión Visual Basic .NET, en la ruta de acceso reemplace Duwamish 7.0 CS por Duwamish 7.0 VB y la extensión cs por la extensión vb; el nombre del archivo es el mismo.

Método Duwamish7.DataAccess.Customers.LoadCustomerByEmail:

[C#]
/// <summary>
///     Retrieves the customer with the provided email address.
///     <param name="emailAddress">Email address for customer.</param>
///     <retvalue>CustomerData, a dataset containing detailed customer information.</retvalue>
/// </summary>
public CustomerData LoadCustomerByEmail(String emailAddress)
{
    if ( dsCommand == null )
    {
        throw new System.ObjectDisposedException( GetType().FullName );
    }            
    CustomerData data = new CustomerData();
    //
    // Get the load command
    //
    dsCommand.SelectCommand = GetLoadCommand();
    dsCommand.SelectCommand.Parameters[EMAIL_PARM].Value = emailAddress;

    dsCommand.Fill(data);
    //
    // Check post conditions
    //        
    ApplicationAssert.CheckCondition(data.Tables[CustomerData.CUSTOMERS_TABLE].Rows.Count <= 1, "Integrity Failure: non-unique e-mail address", ApplicationAssert.LineNumber);
    
    return data;
}
[Visual Basic .NET]
'----------------------------------------------------------------
' Function LoadCustomerByEmail:
'   Retrieves the customer with the provided email address.
' Returns:
'   CustomerData, a dataset containing detailed customer information.
' Parameters:
'   [in]  emailAddress: Email address for customer
'----------------------------------------------------------------
Public Function LoadCustomerByEmail(ByVal emailAddress As String) As CustomerData
    Dim data As New CustomerData

    With dsCommand
        Try
            .SelectCommand = GetLoadCommand
            .SelectCommand.Parameters(EMAIL_PARM).Value = emailAddress
            .Fill(data)
        Finally
            If Not .SelectCommand Is Nothing Then
                If Not .SelectCommand.Connection Is Nothing Then
                    .SelectCommand.Connection.Dispose()
                End If
                .SelectCommand.Dispose()
            End If
            .Dispose()
        End Try
    End With
    '
    ' Check post conditions
    '        
    ApplicationAssert.CheckCondition(data.Tables(CustomerData.CUSTOMERS_TABLE).Rows.Count <= 1, "Integrity Failure: non-unique e-mail address", ApplicationAssert.LineNumber)
    

    
    LoadCustomerByEmail = data
End Function

SPROC

De manera predeterminada, el procedimiento almacenado de SQL está ubicado en [Letra de la unidad en la que esté instalado el archivo de Visual Studio .NET]:\Archivos de programa\Microsoft Visual Studio .NET 2003\Enterprise Samples\Duwamish 7.0 CS\Database\SQLScripts\D7_Sprocs.sql.

Nota   Si tiene instalada la versión Visual Basic .NET, Duwamish 7.0 VB reemplazará a Duwamish 7.0 CS en la ruta de acceso.
--------------------------------------------------
-- GetCustomerByEmail
--------------------------------------------------
CREATE PROCEDURE GetCustomerByEmail
    @Email NVARCHAR(50) = NULL
AS
    SET NOCOUNT ON

    SELECT c.PKId,
           c.Email,
           c.Password,
           c.Name,
           a.Address,
           a.Country,
           a.PhoneNumber,
           a.Fax
      FROM Customers c, 
           Addresses a
     WHERE c.Email = @Email 
       AND a.CustomerId = c.PKId

    RETURN 0

Vea también

Portal Behind the Scenes de Duwamish 7.0 | Información general sobre la arquitectura | Inicio de sesión

Mostrar:
© 2014 Microsoft