2010-05-24 29 views
8

Xin chào, tôi đang sử dụng FormsAuthentication.RedirectFromLoginPage cho thông tin đăng nhập của người dùng và để chuyển hướng đến trang default.aspx. Tôi muốn rằng nếu người dùng được gọi là quản trị viên đăng nhập được chuyển hướng đến trang admin.aspxFormsAuthentication.RedirectFromLoginTrang một trang tùy chỉnh

Có thể không?

Trả lời

14

Hãy thử điều này, tôi nghĩ rằng đó là gần nhất bạn sẽ nhận được một giải pháp đơn giản:

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

Nếu bạn đang sử dụng sự kiểm soát đăng nhập ASP.NET MembershipProvider, bạn có thể viết logic của bạn trong 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"); 
    } 
} 

Đừng quên đặt một số bảo vệ trên là tốt trang admin.aspx, trong trường hợp ai đó trong url trực tiếp

0

Hành vi mặc định là chuyển hướng đến tài nguyên được yêu cầu ban đầu, vì vậy nếu người dùng cố truy cập 'admin.aspx' và không được xác thực, người dùng sẽ được gửi đến trang đăng nhập. Sau khi xác thực thành công, người dùng được gửi đến url được yêu cầu ban đầu (admin.aspx).

sử dụng -> "admin.aspx" -> noauth -> đăng nhập -> "admin.aspx"

Vì vậy, thay vì bằng tay cố gắng để đưa người dùng ở đâu đó, đang sử dụng hành vi mặc định này sẽ không làm việc cho bạn ? Hành vi mặc định thực sự là "mạnh mẽ" (nó có thể là "admin2.aspx", "admin3.aspx" và vân vân ... bạn có thể có bất kỳ số lượng "tài nguyên được bảo vệ" nào và quá trình tích hợp xử lý tất cả nó .. ..)

3

người dùng xác thực

Giả sử bạn đã đi qua bài viết trước đây của tôi đề cập ở trên, bạn có một trang đăng nhập. Bây giờ khi người dùng nhấp vào nút Đăng nhập, phương thức Authenticate sẽ kích hoạt, hãy xem mã cho phương thức đó.

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

bạn có thể kiểm tra bằng cách đặt tên vai trò lõi cứng hoặc bằng cách tìm nạp cuộn người dùng từ cơ sở dữ liệu. tôi đã sửa đổi điều này cho khung thực thể của tôi.

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

và đặt vai trò người dùng như:

user.Role 

Cùng này bạn phải thực hiện một số thay đổi trong Global.asax nộp Đến nay chúng tôi đã thiết lập các vé Forms Authentication với chi tiết cần thiết ngay cả những người sử dụng vai trò trong cookie, bây giờ làm thế nào để lấy lại thông tin đó trên mọi yêu cầu và thấy rằng một yêu cầu đến từ loại vai trò nào? Để làm điều đó, chúng ta cần sử dụng sự kiện Application_AuthenticateRequest của tệp Global.asx. Xem mã bên dưới.

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

       } 

      } 

     } 

    } 

Trong này thậm chí, sau khi kiểm tra nếu người dùng tồn tại, anh/cô ấy được xác thực và loại identy về thành viên thứ là FormsIdentity, tôi nhận được Identity hiện tại của người dùng và nhận được vé tôi đã đặt ở thời gian Authentiacting. Khi tôi đã có vé xác thực, tôi vừa nhận được UserData từ ticket và chia nó thành các vai trò (hãy nhớ, chúng tôi đã lưu trữ các vai trò như các giá trị được phân tách bằng dấu phẩy). Bây giờ, chúng tôi có vai trò người dùng hiện tại để chúng tôi có thể chuyển vai trò của người dùng hiện tại vào đối tượng GenericPrincipal cùng với danh tính hiện tại và chỉ định vai trò này cho đối tượng người dùng curent. Điều này sẽ cho phép chúng tôi sử dụng phương pháp IsInRole để kiểm tra xem một người dùng cụ thể thuộc về một vai trò cụ thể hay không.

Cách kiểm tra xem người dùng có vai trò cụ thể không?

Để kiểm tra xem người dùng có thuộc một vai trò cụ thể hay không, hãy sử dụng mã bên dưới. Mã này sẽ trả về true nếu bản ghi hiện tại đến từ người dùng được xác thực và có vai trò là quản trị viên.

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

Cách kiểm tra xem người dùng có được xác thực không?

Để kiểm tra xem người dùng có được xác thực hay không, hãy sử dụng mã bên dưới.

HttpContext.Current.User.Identity.IsAuthenticated 

Để có được tên người dùng của người đủ thẩm quyền

HttpContext.Current.User.Identity.Name 

Ghi vào điều .. mã này đòi hỏi một số cài đặt webconfig trong thẻ hình thức như:

Add sau thiết lập vào web của bạn Authentication. tệp cấu hình bên dưới.

<authentication mode="Forms"> 

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

</authentication> 

Đối với mỗi người dùng nếu bạn muốn đảm bảo một thư mục cụ thể, bạn có thể đặt thiết lập cho họ, hoặc trong tập tin web.config cha mẹ (thư mục gốc) hoặc file web.config của thư mục đó.

Xác định cài đặt Role cho thư mục trong file web.config gốc (trong trường hợp này cho quản lý)

<location path="Admin"> 

    <system.web> 

     <authorization> 

      <allow roles="admin"/> 

      <deny users="*"/> 

     </authorization> 

    </system.web> 

</location> 

Viết mã này bên ngoài nhưng dưới thẻ trong file web.config của root. Ở đây, tôi xác định rằng nếu đường dẫn chứa tên của thư mục Admin thì chỉ người dùng có vai trò "quản trị" mới được phép và tất cả người dùng khác đều bị từ chối.

Xác định cài đặt Role cho thư mục trong thư mục file web.config cụ thể (trong trường hợp này cho User)

<system.web> 

    <authorization> 

     <allow roles="User"/> 

     <deny users="*"/> 

    </authorization> 

</system.web> 

Viết mã này vào file web.config thư mục người dùng. Bạn cũng có thể chỉ định cài đặt cho người dùng trong tệp web.config của người chủ, cách tôi đã thực hiện cho Quản trị ở trên. Đây chỉ là một cách khác để chỉ định cài đặt. Cài đặt này phải được đặt dưới thẻ.

xác định cài đặt cho người dùng xác thực

<system.web> 

    <authorization> 

     <deny users="?"/> 

    </authorization> 

</system.web> 

Viết mã này vào file web.config của thư mục an toàn. Điều này xác định rằng tất cả người dùng ẩn danh đều bị từ chối cho thư mục này và chỉ những người dùng được xác thực mới được phép không phân biệt vai trò của họ.

hy vọng điều này sẽ cung cấp cho bạn ít ý tưởng để giải quyết vấn đề của mình. nó làm việc tốt cho tôi. hy vọng bạn cũng sẽ giải quyết được vấn đề của mình.

Các vấn đề liên quan