2010-06-22 61 views
2

我環顧四周,找不到我需要採取的簡潔步驟,以便在我的網站中實現表單身份驗證。我正在使用C#3.5和SQL Server後端。我需要採取哪些步驟來實現具有角色的表單身份驗證?

我有我的數據庫中的用戶表和UserRole表。

我在我的應用程序中有5個目錄,其中包含aspx頁面。

聯繫
常見
UserRole1
UserRole2
公共

我想在管理,UserRole1和UserRole2基於角色的安全性。

我的web.config看起來是這樣的...

<system.web> 
    <authentication mode="Forms"> 
     <forms name=".Authentication" loginUrl="UI/Common/Login.aspx" protection="All" path="/" timeout="30" /> 
    </authentication> 
    ... 
    </sytem.web> 

    <location path="UI/Admin"> 
    <system.web> 
     <authorization> 
     <allow roles="Admin"/> 
     <deny users="*"/> 
     </authorization> 
    </system.web> 
    </location> 

    <location path="UI/UserRole1"> 
    <system.web> 
     <authorization> 
     <allow roles="UserRole1"/> 
     <deny users="*"/> 
     </authorization> 
    </system.web> 
    </location> 

    <location path="UI/UserRole2"> 
    <system.web> 
     <authorization> 
     <allow roles="UserRole2"/> 
     <deny users="*"/> 
     </authorization> 
    </system.web> 
    </location> 

我把登錄控制在我的Login.aspx頁和我Login.aspx.cs目前看起來像這樣。

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    if ((from u in db.Users where u.UserName == Login1.UserName select u).Count() == 1) 
    { 
     User user = (from u in db.Users where u.UserName == Login1.UserName select u).First(); 
     //custom Encryption class, returns true if password is correct 
     if (Encryption.VerifyHash(Login1.Password, user.Salt, user.Hash)) 
     { 
      string myRole = (from ur in user.UserRoles where ur.UserRoleID == user.UserRoleID select ur.Role).First(); 
      //???  
     } 
     else 
     { 
      e.Authenticated = false; 
     } 
    } 
    else 
    { 
     e.Authenticated = false; 
    } 
} 

Annnnd我堅持,我不知道怎麼告訴我的應用我的用戶的角色是什麼。

請幫我:)

謝謝!

編輯:

我改變了我的身份驗證事件的代碼

 string role = (from ur in user.UserRoles where ur.UserRoleID == user.UserRoleID select ur.Role).First(); 
     if (!Roles.RoleExists(role)) 
      Roles.CreateRole(role); 
     if (Roles.FindUsersInRole(role, user.UserName).Length == 0) 
      Roles.AddUserToRole(user.UserName, role); 
     e.Authenticated = true; 
     string returnUrl = Request.QueryString["ReturnUrl"]; 
     if (returnUrl == null) returnUrl = "/"; 
     Response.Redirect(returnUrl); 

不過,我不斷收到踢回登錄屏幕。

登錄按下小提琴手捕獲後看起來像
302 /Web/UI/Common/Login.aspx?ReturnUrl=%2fWeb%2fUI%2fAdmin%2fDefault.aspx
302 /網絡/ UI /管理/默認。 ASPX
200 /Web/UI/Common/Login.aspx?ReturnUrl=%2fWeb%2fUI%2fAdmin%2fDefault.aspx

編輯2:

我覺得我得到了驗證和運行,但我隨機獲取連接套接字管道錯誤。

我的認證是這樣的:

 FormsAuthentication.Initialize(); 
    if (!Roles.RoleExists(role)) 
     Roles.CreateRole(role); 
    if (Roles.FindUsersInRole(role, user.UserName).Length == 0) 
     Roles.AddUserToRole(user.UserName, role); 
    e.Authenticated = true; 
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, 
     user.UserName, 
     DateTime.Now, 
     DateTime.Now.AddMinutes(30), // value of time out property 
     true, // Value of IsPersistent property 
     string.Empty, 
     FormsAuthentication.FormsCookiePath); 
    string encryptedTicket = FormsAuthentication.Encrypt(ticket); 
    HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 
    if (ticket.IsPersistent) authCookie.Expires = ticket.Expiration; 
    authCookie.Secure = false; //set to true when https is enabled 
    Response.Cookies.Add(authCookie); 

    FormsAuthentication.RedirectFromLoginPage(user.UserName, true); 
+0

這傢伙解決了我的一切。 http://www.xoc.net/works/tips/forms-authentication.asp – 2010-06-24 19:55:45

回答

1

可以使用Roles類的方法,比如:

Roles.AddUserToRole(string userName, string roleName); 
Roles.AddUserToRoles(string userName, string[] roleNames); 
Roles.AddUsersToRole(string[] userNames, string roleName); 
Roles.AddUsersToRoles(string[] userNames, string[] roleNames; 

確保您using System.Web.Security

+0

嗯,我一直在踢回登錄屏幕。 – 2010-06-22 17:56:04

+0

@Biff你可以嘗試使用LoggedIn事件而不是Authenticate事件。 – 2010-06-22 18:04:56

+0

我認爲我的問題是我需要以某種方式堅持用戶。 – 2010-06-22 18:23:25

0

我想你缺少的是一個會員供應商。您可以使用默認的成員資格提供程序或添加自定義的提供程序(這將允許您執行自己的驗證和角色分配)。看看this來自4個人的文章。無論採用哪種方式,您都應該能夠將成員資格提供程序插入您的系統,並使用您已擁有的登錄控件來維護整個站點的身份驗證。

相關問題