【问题标题】:Length of the cookie text for caching RolePrincipal is always larger than 4096缓存 RolePrincipal 的 cookie 文本长度始终大于 4096
【发布时间】:2012-08-22 17:14:39
【问题描述】:

我尝试为我的项目实施基于 ASP.NET 角色的授权,但我从未发现 cookie 保存在客户端浏览器中。我尝试了一些测试代码,例如,

RolePrincipal rolePrincipal = new RolePrincipal(new GenericIdentity("a"));
string text1 = rolePrincipal.ToEncryptedTicket();

在这个简单的 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>

【问题讨论】:

  • 查看这篇文章 stackoverflow.com/questions/836043/… 你不应该手动这样做,让 .net 为你整理出来
  • 谢谢!我也不想手动执行此操作,但在调用 IsInRole 和 GetRolesForUser 后,我在客户端浏览器中看不到角色的 cookie,所以我做了一些测试,如示例代码,我想我与你分享的帖子有类似的设置,只是我无法生成 cookie...这很奇怪
  • 您能否发布与会员资格相关的 web.config 部分 - 很高兴为您仔细检查。
  • 非常感谢!我在原帖中更新了 web.config 的内容,大部分都是默认设置。并且 cookie '.TestAUTH' 能够在客户端浏览器中找到..
  • 添加了一个答案以明确显示我认为你需要做什么;o)

标签: asp.net forms-authentication roleprovider role-based


【解决方案1】:

尝试添加默认提供者,所以从这里开始:

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

【讨论】:

  • 我刚刚尝试将defaultProvider添加到web.config,不幸的是它仍然是没有生成cookie的旧方法
  • 只是为了确定 - 您有一些角色被拒绝并与您登录的用户相关联?
  • 是的,我有一个角色管理员分配给我的测试用户帐户,我已经调试以从 GetRoleForUser 和 IsInRole 函数获取正确的值
  • 在这里查看接受的答案stackoverflow.com/questions/3282999/… 看起来它只在调用 IsInRole 时使用 - 你可以尝试调用它并让我知道是否生成/使用了 cookie?
  • 好像是.net framework 4.5的bug,卸载.net framework 4.5重新安装framework 4.0后,cookie又回来了。 v4.5生成的cookie文本长度是v4.0的10倍...
【解决方案2】:

不幸的是,由于 .NET 4.5 中的基础类型发生了变化,这是设计使然。您可以关闭在 cookie 中存储用户角色以防止出现此问题 (http://msdn.microsoft.com/en-us/library/system.web.security.roles.cacherolesincookie.aspx)。

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

【讨论】:

  • 我已更新此错误的解决方案,因为它已修复,并且很快将通过 Windows 更新提供修复。感谢您报告此问题。非常感谢
【解决方案3】:

仅供参考:

Microsoft 最近发布了修复此问题的更新。

KB 2750147

【讨论】:

    猜你喜欢
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 2011-02-13
    • 1970-01-01
    • 2018-10-21
    • 2011-01-20
    • 1970-01-01
    相关资源
    最近更新 更多