2010-05-24 14 views

Respuesta

14

Prueba de esto, creo que es el más cercano que se consigue con una solución sencilla:

FormsAuthentication.SetAuthCookie(username, true); 
Response.Redirect("mypage.aspx"); 
1

Si está utilizando el control de inicio de sesión ASP.NET MembershipProvider, usted puede escribir su lógica en el LoggedIn event

<asp:Login id="Login1" runat="server" OnLoggedIn="OnLoggedIn"></asp:Login> 


protecetd void OnLoggedIn(object sender, EventArgs e) 
{ 

    if(Roles.IsUserInRole(User.Identity.Name, "Administrators")) 
    { 
     //Redirect to admin page 
     Response.Redirect("~/Admin.aspx"); 
    } 
} 

No se olvide de poner un poco de protección en la página admin.aspx aswell, en caso que alguien escribe en la url directamente

0

El comportamiento predeterminado es redirigir al recurso solicitado originalmente, por lo que si un usuario intentó acceder a 'admin.aspx' y no está autenticado, el usuario se envía a la página de inicio de sesión. Después de la autenticación con éxito, el usuario se envía a la url solicitada originalmente (admin.aspx).

de usuario -> "admin.aspx" -> noauth -> inicio de sesión -> "admin.aspx"

Así que en lugar de tratar de forma manual para enviar a los usuarios en algún lugar, se utiliza este comportamiento por defecto no va a funcionar para usted ? El comportamiento predeterminado es en realidad "robusto" (puede ser "admin2.aspx", "admin3.aspx" y así sucesivamente ... puede tener cualquier cantidad de "recursos protegidos" y el proceso integrado lo maneja todo ... ..)

3

usuarios Autenticación

Suponiendo que haya pasado por mi artículo anterior mencionado anteriormente, que tienen una página de inicio de sesión. Ahora cuando el usuario hace clic en el botón Iniciar sesión Authenticate se dispara el método, veamos el código para ese método.

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    string userName = Login1.UserName; 
    string password = Login1.Password; 
    bool rememberUserName = Login1.RememberMeSet; 

    // for this demo purpose, I am storing user details into xml file 
    string dataPath = Server.MapPath("~/App_Data/UserInformation.xml"); 
    DataSet dSet = new DataSet(); 
    dSet.ReadXml(dataPath); 
    DataRow[] rows = dSet.Tables[0].Select(" UserName = '" + userName + "' AND Password = '" + password + "'"); 
    // record validated 
    if (rows.Length > 0) 
    { 
     // get the role now 
     string roles = rows[0]["Roles"].ToString(); 
     // Create forms authentication ticket 
     FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
     1, // Ticket version 
     userName, // Username to be associated with this ticket 
     DateTime.Now, // Date/time ticket was issued 
     DateTime.Now.AddMinutes(50), // Date and time the cookie will expire 
     rememberUserName, // if user has chcked rememebr me then create persistent cookie 
     roles, // store the user data, in this case roles of the user 
     FormsAuthentication.FormsCookiePath); // Cookie path specified in the web.config file in <Forms> tag if any. 

     // To give more security it is suggested to hash it 
     string hashCookies = FormsAuthentication.Encrypt(ticket); 
     HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashCookies); // Hashed ticket 

     // Add the cookie to the response, user browser 
     Response.Cookies.Add(cookie);    // Get the requested page from the url 
     string returnUrl = Request.QueryString["ReturnUrl"]; 

     // check if it exists, if not then redirect to default page 
     if (returnUrl == null) returnUrl = "~/Default.aspx"; 
     Response.Redirect(returnUrl); 
    } 
    else // wrong username and password 
    { 
     // do nothing, Login control will automatically show the failure message 
     // if you are not using Login control, show the failure message explicitely 
    } 
} 

puede verificarlo colocando el nombre del rol del núcleo duro o recuperando el rollo de usuario de la base de datos. He modificado esto para mi marco de entidad.

TestEntities entities = new TestEntities(); 
      var user = (from s in entities.UserTables 
         where s.UserName == loginControl.UserName 
         && s.Password == loginControl.Password 
         select s).SingleOrDefault(); 

y se coloca el papel de usuario como:

user.Role 

lo largo de este que tiene hacer algunos cambios en el archivo Global.asax Hasta ahora hemos establecido el billete de autenticación de formularios con datos requeridos incluso los usuarios roles en la cookie, ahora ¿cómo recuperar esa información en cada solicitud y encontrar que viene una solicitud de qué tipo de función? Para hacer eso, necesitamos usar el evento Application_AuthenticateRequest del archivo Global.asx. Vea el código a continuación.

protected void Application_AuthenticateRequest(object sender, EventArgs e) 
    { 

     // look if any security information exists for this request 

     if (HttpContext.Current.User != null) 
     { 

      // see if this user is authenticated, any authenticated cookie (ticket) exists for this user 

      if (HttpContext.Current.User.Identity.IsAuthenticated) 
      { 

       // see if the authentication is done using FormsAuthentication 

       if (HttpContext.Current.User.Identity is FormsIdentity) 
       { 

        // Get the roles stored for this request from the ticket 

        // get the identity of the user 

        FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity; 

        // get the forms authetication ticket of the user 

        FormsAuthenticationTicket ticket = identity.Ticket; 

        // get the roles stored as UserData into the ticket 

        string[] roles = ticket.UserData.Split(','); 

        // create generic principal and assign it to the current request 

        HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(identity, roles); 

       } 

      } 

     } 

    } 

En este par, después de comprobar si existe el usuario, él/ella está autenticado y el tipo identy de l usuario es FormsIdentity, estoy consiguiendo la identidad actual del usuario y conseguir el billete he fijado en el tiempo de Authentiacting. Una vez que tengo el boleto autenticado, acabo de obtener el UserData del ticket y lo divido para obtener los roles (recuerde, habíamos almacenado los roles como valores separados por comas). Ahora, tenemos funciones de usuarios actuales para poder pasar las funciones del usuario actual en el objeto GenericPrincipal junto con la identidad actual y asignar esto al objeto de usuario actual. Esto nos permitirá usar el método IsInRole para verificar si un usuario en particular pertenece o no a un rol en particular.

¿Cómo comprobar si el usuario tiene un rol particular?

Para verificar si un usuario pertenece a un rol de particulr, use el siguiente código. Este código será verdadero si el registro actual proviene del usuario que está autenticado y tiene el rol de administrador.

HttpContext.Current.User.IsInRole("admin") 

Cómo verificar si el usuario está autenticado?

Para verificar si el usuario está autenticado o no, utilice el siguiente código.

HttpContext.Current.User.Identity.IsAuthenticated 

Para obtener el usuario del usuario autenticado

HttpContext.Current.User.Identity.Name 

Recordarme en este código cosa .. requiere algunos ajustes WebConfig en la etiqueta de la forma de:

Agregar siguientes estableciendo en su web de Autenticación. archivo de configuración debajo.

<authentication mode="Forms"> 

    <forms defaultUrl="default.aspx" loginUrl="~/login.aspx" slidingExpiration="true" timeout="20" ></forms> 

</authentication> 

Por cada usuario si desea proteger una carpeta en particular, se puede colocar el establecimiento para ellos, ya sea en el archivo web.config padre (carpeta raíz) o un archivo web.config de esa carpeta.

Especificar configuración de las funciones de la carpeta en el archivo Web.config raíz (en este caso para Admin)

<location path="Admin"> 

    <system.web> 

     <authorization> 

      <allow roles="admin"/> 

      <deny users="*"/> 

     </authorization> 

    </system.web> 

</location> 

escribir este código fuera pero bajo la etiqueta en el archivo web.config de la raíz. Aquí, especifico que si la ruta contiene el nombre de la carpeta Admin, entonces solo se permiten los usuarios con roles "admin" y todos los demás usuarios son denegados.

Especificar configuración de las funciones de la carpeta en la carpeta de archivo web.config específica (en este caso para el usuario)

<system.web> 

    <authorization> 

     <allow roles="User"/> 

     <deny users="*"/> 

    </authorization> 

</system.web> 

escribir este código en la carpeta de usuario del archivo web.config. También puede especificar la configuración para el usuario en el archivo web.config de la raíz, de la misma manera que lo he hecho para el administrador anterior. Esta es solo otra forma de especificar la configuración. Esta configuración debe colocarse debajo de la etiqueta.

especificar la configuración de usuario autenticado

<system.web> 

    <authorization> 

     <deny users="?"/> 

    </authorization> 

</system.web> 

escribir este código en el archivo web.config de la carpeta Secure. Esto especifica que se deniegan todos los usuarios anónimos para esta carpeta y solo se permiten usuarios autenticados independientemente de sus roles.

Espero que esto le dará una pequeña idea para resolver su problema. Está funcionando bien para mí. espero que también resuelva su problema.

Cuestiones relacionadas