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.