2010-05-24 8 views

Répondre

14

Essayez, je pense qu'il est le plus proche vous obtiendrez avec une solution simple:

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

Si vous utilisez le contrôle de connexion ASP.NET MembershipProvider, vous pouvez écrire votre logique dans le 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"); 
    } 
} 

Ne pas oublier de mettre une certaine protection sur la aswell page admin.aspx, Incase quelqu'un tape dans l'url directement

0

Le comportement par défaut est de rediriger vers la ressource initialement demandée, donc si un utilisateur a essayé d'accéder à 'admin.aspx' et n'est pas authentifié, l'utilisateur est envoyé à la page de connexion. Une fois l'authentification réussie, l'utilisateur est envoyé à l'URL demandée à l'origine (admin.aspx).

utilisateur -> « admin.aspx » -> noauth -> Connexion -> « admin.aspx »

Ainsi, au lieu d'essayer d'envoyer manuellement quelque part les utilisateurs, utilise ce comportement par défaut ne va pas travailler pour vous ? Le comportement par défaut est en fait "robuste" (il peut être "admin2.aspx", "admin3.aspx" et ainsi de suite ... vous pouvez avoir un certain nombre de "ressources protégées" et le processus intégré gère tout cela .. ..)

3

utilisateurs Authentification

en supposant que vous avez passé par mon précédent article mentionné ci-dessus, vous avez une page de connexion. Maintenant, lorsque l'utilisateur clique sur le bouton de connexion Authenticate déclenche la méthode, permet de voir le code pour cette méthode.

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 
    } 
} 

Vous pouvez le vérifier en plaçant un nom de rôle de noyau dur ou en récupérant le rôle utilisateur dans la base de données. J'ai modifié cela pour mon cadre d'entité.

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

et placé le rôle de l'utilisateur comme:

user.Role 

Le long de ce que vous avez fait quelques changements dans le fichier Global.asax Jusqu'à présent, nous avons mis le ticket d'authentification de formulaires avec les détails nécessaires, même l'utilisateur rôles dans le cookie, maintenant comment récupérer cette information sur chaque demande et de trouver qu'une demande vient de quel type de rôle? Pour ce faire, nous devons utiliser l'événement Application_AuthenticateRequest du fichier Global.asx. Voir le code ci-dessous.

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); 

       } 

      } 

     } 

    } 

Dans ce même, après avoir vérifié si utilisateur existe, il/elle est authentifiée et je suis le type de Identy d'utilisateur e est FormsIdentity, obtenir l'identité actuelle de l'utilisateur et obtenir le billet que je l'ai mis à la temps d'authentification. Une fois que j'ai le ticket authentifié, je viens d'obtenir le UserData du ticket et je le scinde pour obtenir des rôles (souvenez-vous, nous avions stocké les rôles comme des valeurs séparées par des virgules). Maintenant, nous avons des rôles d'utilisateurs actuels afin que nous puissions passer les rôles de l'utilisateur courant dans l'objet GenericPrincipal avec l'identité actuelle et l'assigner à l'objet utilisateur courant. Cela nous permettra d'utiliser la méthode IsInRole pour vérifier si un utilisateur particulier appartient à un rôle particulier ou non.

Comment vérifier si l'utilisateur a un rôle particulier?

Pour vérifier si un utilisateur appartient à un rôle particulier, utilisez le code ci-dessous. Ce code renvoie true si l'enregistrement en cours provient de l'utilisateur authentifié et a un rôle d'administrateur.

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

Comment vérifier si l'utilisateur est authentifié?

Pour vérifier si l'utilisateur est authentifié ou non, utilisez le code ci-dessous.

HttpContext.Current.User.Identity.IsAuthenticated 

Pour obtenir Nom de l'utilisateur assermentée

HttpContext.Current.User.Identity.Name 

Rappelez-vous de chose .. ce code nécessite certains paramètres de webConfig dans la balise forme:

Ajouter suivants paramètre d'authentification dans votre site Web. fichier de configuration sous.

<authentication mode="Forms"> 

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

</authentication> 

Pour chaque utilisateur si vous souhaitez obtenir un dossier particulier, vous pouvez placer réglage pour eux, soit dans le fichier web.config parent (dossier racine) ou d'un fichier web.config de ce dossier.

Spécifier les paramètres de rôle pour le dossier dans le fichier web.config racine (dans ce cas pour Admin)

<location path="Admin"> 

    <system.web> 

     <authorization> 

      <allow roles="admin"/> 

      <deny users="*"/> 

     </authorization> 

    </system.web> 

</location> 

écrire ce code extérieur mais sous étiquette dans le fichier web.config de la racine. Ici, je spécifie que si le chemin contient le nom du dossier Admin, seuls les utilisateurs ayant des rôles "admin" sont autorisés et tous les autres utilisateurs sont refusés.

Spécifier les paramètres de rôle pour le dossier dans le fichier web.config spécifique du dossier (dans ce cas pour l'utilisateur)

<system.web> 

    <authorization> 

     <allow roles="User"/> 

     <deny users="*"/> 

    </authorization> 

</system.web> 

écriture ce code dans le dossier utilisateur du fichier web.config. Vous pouvez également spécifier le paramètre pour l'utilisateur dans le fichier web.config de root, comme je l'ai fait pour l'Admin ci-dessus. C'est juste une autre façon de spécifier les paramètres. Ces paramètres doivent être placés sous étiquette.

Spécifiez le réglage de l'utilisateur assermentée

<system.web> 

    <authorization> 

     <deny users="?"/> 

    </authorization> 

</system.web> 

écrire ce code dans le fichier web.config du dossier sécurisé. Ceci spécifie que tous les utilisateurs anonymes sont refusés pour ce dossier et seuls les utilisateurs authentifiés sont autorisés quel que soit leur rôle.

espérons que cela vous donnera une petite idée pour résoudre votre problème. ça fonctionne bien pour moi. espérons que vous pourrez également résoudre votre problème.

Questions connexes