2012-08-22 83 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