2012-08-22 20 views
0

我試過爲我的項目實現ASP.NET基於角色的授權,但我從未發現cookie保存在客戶端瀏覽器中。我嘗試了一些測試代碼一樣,用於緩存RolePrincipal的Cookie文本的長度始終大於4096

還有在這個如此簡單的RolePrincipal對象中沒有的角色和Roles.CookieProtectionValue設置爲「無」。然而,text1的長度是4,688,大於4,096,因此無法將cookie推入客戶端瀏覽器。

它沒有任何意義,否則無法使用cookie來緩存角色。

它有什麼問題?

感謝

這裏的相關章節的web.config

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/LogOn" timeout="2880" name=".TestAUTH"/> 
</authentication> 
<membership> 
    <providers> 
    <clear/> 
    <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" 
     enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" 
     maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" 
     applicationName="/" /> 
    </providers> 
</membership> 

<profile> 
    <providers> 
    <clear/> 
    <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
    </providers> 
</profile> 

<roleManager enabled="true" cookieName=".TestROLE" cookieProtection="None" cacheRolesInCookie="true" cookieTimeout="30" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="false" > 
    <providers> 
    <clear/> 
    <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
    <!--<add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />--> 
    </providers> 
</roleManager> 
+0

檢查這個帖子http://stackoverflow.com/questions/836043/does-the-asp-net-rolemanager-really-cache-the-roles-for-a-user-in- a-cookie-if-so你不應該手動做這個讓.net爲你排序 – bUKaneer

+0

謝謝!我不想手動執行此操作,但在我調用IsInRole和GetRolesForUser後,我無法在客戶端瀏覽器中查看角色的Cookie,因此我做了一些測試,如示例代碼,我認爲我對您分享的帖子有類似的設置,只是我無法獲取生成的cookie ...這很奇怪 – Johnny

+0

你可以發佈你的web.config有關會員資格的部分 - 很高興再次檢查它。 – bUKaneer

回答

0

不幸這是通過由於.NET 4.5中基礎類型的改變而設計的。您可以關閉在Cookie中存儲用戶角色以防止此問題(http://msdn.microsoft.com/zh-cn/library/system.web.security.roles.cacherolesincookie.aspx)。

https://connect.microsoft.com/VisualStudio/feedback/details/759157/net-4-5-binaryformatter-serialization-generates-too-long-string

+0

我已經更新了該錯誤的解決方案,因爲它已經修復,並且很快將通過Windows Update提供修復。感謝您報告此問題。很多appriciated – Anand

0

嘗試從這個添加默認的提供者,因此:

<roleManager enabled="true" cookieName=".TestROLE" cookieProtection="None" cacheRolesInCookie="true" cookieTimeout="30" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="false" > 
    <providers> 
    <clear/> 
    <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
    <!--<add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />--> 
    </providers> 
</roleManager> 

這樣:

<roleManager defaultProvider="AspNetSqlRoleProvider" enabled="true" cookieName=".TestROLE" cookieProtection="None" cacheRolesInCookie="true" cookieTimeout="30" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="false" > 
    <providers> 
    <clear/> 
    <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
    <!--<add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />--> 
    </providers> 
</roleManager> 
+0

我剛剛嘗試將defaultProvider添加到web.config,不幸的是它仍然是舊的沒有cookie生成的方式 – Johnny

+0

只是要確定 - 你有一些角色藐視和關聯到用戶登錄爲? – bUKaneer

+0

是的我有一個角色管理員分配給我的測試用戶帳戶,我已經調試從GetRoleForUser和IsInRole函數獲取正確的值 – Johnny

-1

FYI:

微軟最近公佈了修復此問題的更新。

KB 2750147