2010-05-24 24 views

risposta

14

Prova questo, penso che sia la più vicina si arriva con una soluzione semplice:

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

Se si utilizza il controllo di accesso ASP.NET MembershipProvider, è possibile scrivere la vostra logica nel 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"); 
    } 
} 

Non dimenticare di mettere un po 'di protezione sulla pagina Admin.aspx entrava, in caso qualcuno digita nell'url direttamente

0

Il comportamento predefinito è il reindirizzamento alla risorsa richiesta in origine, quindi se un utente ha tentato di accedere a 'admin.aspx' e non è autenticato, l'utente viene inviato alla pagina di accesso. Dopo l'autenticazione, l'utente viene inviato all'URL originariamente richiesto (admin.aspx).

utente -> "Admin.aspx" -> noauth -> login -> "Admin.aspx"

Così, invece di cercare manualmente per inviare agli utenti da qualche parte, sta utilizzando questo comportamento predefinito non andare a lavorare per voi ? Il comportamento di default è in realtà "robusto" (che può essere "admin2.aspx", "admin3.aspx" e così via ... si può avere un numero qualsiasi di "risorse protette" e il costruito nel processo gestisce tutto questo .. ..)

3

Autenticazione degli utenti

Supponendo che sono passati attraverso il mio precedente articolo di cui sopra, si dispone di una pagina di login. Ora, quando l'utente fa clic pulsante Login Authenticate metodo incendi, vediamo il codice per quel metodo.

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

è possibile controllare inserendo nome hard core ruolo o con recupero rullo utente dal database. ho modificato questo per il mio framework di entità.

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

e collocato il ruolo utente come:

user.Role 

Lungo questo è necessario fare alcuni cambiamenti nella Global.asax il file Fino ad ora abbiamo impostato il biglietto autenticazione basata su form con i dati richiesti anche l'utente ruoli nel cookie, ora come recuperare le informazioni su ogni richiesta e scoprire che una richiesta proviene da quale tipo di ruolo? Per fare ciò abbiamo bisogno di utilizzare l'evento Application_AuthenticateRequest del file Global.asx. Guarda il codice qui sotto.

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

       } 

      } 

     } 

    } 

In questo, anche, dopo aver controllato se esiste utente, lui/lei è autenticato e il tipo IDENTITÀ di esimo utente è FormsIdentity, sto ottenendo l'identità corrente dell'utente e ottenere il biglietto che ho fissato al tempo di Authentiacting. Una volta che ho il biglietto autenticato, ho appena ricevuto l'UserData dal ticket e dividerlo per ottenere ruoli (ricordate, avevamo conservato i ruoli come valori separati da virgola). Ora, abbiamo ruoli attuali utenti in modo che possano passare i ruoli dell'utente corrente nell'oggetto GenericPrincipal insieme con l'identità corrente e assegnare questo all'oggetto utente curent. Questo ci consentirà di utilizzare il metodo IsInRole per verificare se un determinato utente appartiene o meno a un determinato ruolo.

Come controllare se l'utente ha un ruolo particolare?

Per verificare se un utente appartiene a un ruolo particolare, utilizzare il codice riportato di seguito. Questo codice restituirà true se il record corrente proviene dall'utente che è autenticato e ha il ruolo di amministratore.

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

Come verificare se l'utente è autenticato?

Per verificare se l'utente è autenticato o meno, utilizzare sotto il codice.

HttpContext.Current.User.Identity.IsAuthenticated 

Per ottenere nome utente dell'utente autenticato

HttpContext.Current.User.Identity.Name 

Ricorda su cosa .. questo codice richiede alcune impostazioni webConfig nel tag forme come:

Add seguente impostazione nel vostro web di autenticazione. file di configurazione sotto.

<authentication mode="Forms"> 

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

</authentication> 

Per ogni utente, se si vuole garantire una particolare cartella, è possibile inserire l'impostazione per loro nel file web.config padre (cartella principale) una o file web.config di quella cartella.

Specificare le impostazioni di ruolo per la cartella in root file web.config (in questo caso per Admin)

<location path="Admin"> 

    <system.web> 

     <authorization> 

      <allow roles="admin"/> 

      <deny users="*"/> 

     </authorization> 

    </system.web> 

</location> 

scrivere questo codice al di fuori, ma sotto tag nel file web.config di root. Qui, sto specificando che se il percorso contiene il nome della cartella Admin, sono consentiti solo gli utenti con ruoli "admin" e tutti gli altri utenti vengono negati.

Specificare le impostazioni di ruolo per la cartella in file web.config specifica cartella (in questo caso per l'utente)

<system.web> 

    <authorization> 

     <allow roles="User"/> 

     <deny users="*"/> 

    </authorization> 

</system.web> 

Scrivi questo codice nella cartella utente file web.config. Puoi anche specificare l'impostazione per l'utente nel file web.config di root, come ho fatto per l'Admin sopra. Questo è solo un altro modo per specificare le impostazioni. Queste impostazioni dovrebbero essere poste sotto il tag.

specificare le impostazioni per l'utente autenticato

<system.web> 

    <authorization> 

     <deny users="?"/> 

    </authorization> 

</system.web> 

Scrivi questo codice nel file web.config della cartella Secure. Questo sta specificando che tutti gli utenti anonimi sono negati per questa cartella e solo gli utenti autenticati sono autorizzati indipendentemente dal loro ruolo.

spero che questo vi darà una piccola idea per risolvere il vostro problema. sta funzionando bene per me. spero che anche tu risolvi il tuo problema.

Problemi correlati