2009-11-09 60 views
0

我在實現自定義ASP.NET RoleProvider時遇到困難。自定義ASP.NET RoleProvider問題

首先,讓我告訴你在我的web.config文件中的相關設置:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <authentication mode="Forms"> 
     <forms loginUrl="Login.aspx" 
      name="FormsAuthentication" 
      path="Default.aspx" 
      timeout="20"/> 
    </authentication> 

    <membership defaultProvider="MembershipProvider"> 
     <providers> 
     <clear /> 
     <add name="MembershipProvider" 
      type="CompanyName.Security.MembershipProvider" /> 
     </providers> 
    </membership> 

    <roleManager defaultProvider="RoleProvider" 
       enabled="true"> 
     <providers> 
     <clear /> 
     <add name="RoleProvider" 
      type="CompanyName.Security.RoleProvider" /> 
     </providers> 
    </roleManager> 
    </system.web> 
    <location path="Employees.aspx"> 
    <system.web> 
     <authorization> 
     <deny users="?"/> 
     <allow roles="Employees"/> 
     </authorization> 
    </system.web> 
    </location> 
</configuration> 

這裏的登錄按鈕的事件處理程序的代碼:基於

if (Membership.ValidateUser(tbxUsername.Text, tbxPassword.Text)) 
    Response.Redirect("./Employees.aspx"); 
else 
{ 
    tbxUsername.Text = string.Empty; 
    tbxPassword.Text = string.Empty; 
    tbxUsername.Focus(); 
    lblLogin.Visible = true; 
} 

旁註FormsAuthentication.RedirectFromLoginPage()建議:
[有人建議我使用FormsAuthentication.RedirectFromLoginPage()而不是Response.Redirect()。最終,我想根據他/她的角色將用戶重定向到其他頁面。我不知道FormsAuthentication.RedirectFromLoginPage()如何允許我這樣做,因爲它不接受重定向url作爲參數。另外,我的理解是,我可以在Response.Redirect()之前調用FormsAuthentication.SetAuthCookie(),以創建FormsAuthentication.RedirectFromLoginPage()創建的身份驗證Cookie。請讓我知道,如果我的思維過程在這裏是錯誤的。]

通過源代碼後,我可以看到Membership.ValidateUser()正在執行我的自定義MembershipProvider類的ValidateUser()函數。但是,當有效用戶登錄並重定向到Employees.aspx時,用戶將返回到Login.aspx **?ReturnUrl =%2fEmployees.aspx **。我認爲這是因爲雖然用戶進行身份驗證,但他/她對Employees.aspx資源的授權失敗。

有了這個假設,我在我的自定義RoleProvider類的每個函數上創建了斷點,以查看事情發生的地方。當我調試時,其中沒有一個會中斷執行。我的RoleProvider中的大多數代碼都會拋出NotYetImplementetExceptions,但我仍然期望觸及斷點(然後會實現那些所需的功能)。這裏有兩個簡單化向下的功能我已經實現:

public override string[] GetRolesForUser(string username) 
{ 
    return new string[1] {"Employees"}; 
} 

public override bool IsUserInRole(string username, string roleName) 
{ 
    return true; 
} 

我認爲,既然RoleProvider代碼永遠不會執行,那一定出事了與我的web.config。

我已經在過去兩天裏搜索了這個答案,並且嘗試了各種更改,但沒有成功。有沒有人看到我要去哪裏錯了?

在此先感謝!

回答

0

我改變了路徑值(見下文)從「Default.aspx的」到「/」,現在在定製RoleProvider的斷點被擊中!

不工作

<authentication mode="Forms"> 
    <forms loginUrl="Login.aspx" 
     name="FormsAuthentication" 
     path="Default.aspx" 
     timeout="20"/> 
</authentication> 

作品

<authentication mode="Forms"> 
    <forms loginUrl="Login.aspx" 
     name="FormsAuthentication" 
     path="/" 
     timeout="20"/> 
</authentication> 
0

檢查用戶是否是角色:

If (Roles.IsUserInRole("Employees")) 
{ 
} 

或嘗試,如果它的工作原理沒有角色檢查:

<allow users="*"/> 

也許有助於配置變化:

<location path="Employees.aspx"> 
    <system.web> 
     <authorization>   
     <allow roles="Employees"/> 
     <deny users="*"/> 
     </authorization> 
    </system.web> 
    </location> 
+0

我會更新我的問題,你的第一個建議作出迴應。 按照您的建議消除角色檢查時,用戶會按預期重定向。 你的第三個建議沒有按照預期重定向用戶,但是如果我刪除並且只有,它就可以工作。 這很好,但令我困擾的是我的自定義RoleProvider中的函數仍未被調用。 – Paul 2009-11-09 07:09:54

+0

並有你overide字符串[] GetRolesForUser(字符串用戶名)的方法? – 2009-11-09 07:15:33

+0

是的,用「return new string [1] {」Employees「};」 (用於測試) 但是,我認爲這裏的關鍵問題是似乎沒有任何重寫函數被調用(因爲斷點沒有被命中)。 – Paul 2009-11-09 07:25:32

1

認證用戶之後使用Membership.ValidateUser,你應該調用FormsAuthentication.RedirectFromLoginPage而不是Resp onse.Redirect創建表單身份驗證票證。

查看 MSDN documentation for Membership.ValidateUser舉例。

編輯

或者,如果你想重定向到一個特定的網頁,呼籲FormsAuthentication.SetAuthCookie調用的Response.Redirect之前創建的窗體身份驗證票。

它重定向身份驗證的用戶的Default.aspx

其實它重定向回到最初請求的頁面,這是不一定的Default.aspx

EDIT 2

此外,您的配置還存在問題:

  • path屬性不應指向特定頁面(在您的情況下爲Default.aspx),而是指向該網站的根目錄。默認值是「/」,因爲大多數瀏覽器都是區分大小寫的,所以如果有不匹配的情況發送cookie。

    <forms loginUrl="Login.aspx" 
         name="FormsAuthentication" 
         path="/" 
         timeout="20"/> 
    
+0

我碰到了那篇文章,但被FormsAuthentication.RedirectFromLoginPage()函數不要求用戶應該重定向到的頁面這一事實所困惑。它將經過身份驗證的用戶重定向到default.aspx。 我想根據他/她的角色重定向用戶。 < - 我會將其添加到我的問題中。 – Paul 2009-11-09 06:43:20

+0

我在Response.Redirect()調用之前添加了FormsAuthentication.SetAuthCookie()函數,但仍然指向Login.aspx?ReturnUrl =%2fEmployees.aspx。 – Paul 2009-11-09 07:30:09