ASP.Net Identity 2.0: 用户是 System.Web.Security.RolePrincipal,为什么?

5
我正在尝试在现有应用程序中实现Asp.Net Identity 2.0 (OWIN),但是在角色方面遇到了各种问题。我从项目模板创建了一个示例项目,并且(据我所知)将其中的所有内容都复制到了我的应用程序中。我修改了连接信息,以便认证表来自于我的Sql数据库而不是默认的本地DB。
一切似乎都很顺利。表在启动时被初始化(创建),我可以创建一个新用户,为该用户分配角色,并以该用户身份登录。但是,当我尝试检查用户是否属于特定角色时,我会收到一个异常,指示找不到本地数据库的问题。那肯定是因为我没有使用本地DB。那么为什么我的应用程序会在(不存在的)本地DB中查找角色呢?
为了排除我的Sql实例中的奇怪情况,我更改了示例应用程序的连接数据,使其指向我的DB并运行它。我可以使用我在应用程序中创建的用户登录,甚至可以成功地查询该用户的角色。通过直接检查表格,我确认了这一点,并验证了用户、角色和用户-角色关联都存在。
但是,我注意到了一件事情。当我运行示例应用程序时,用户是System.Security.Claims.ClaimsPrincipal的实例。但是当我运行我的应用程序时,用户是System.Web.Security.RolePrincipal的实例。
那么,我错过了什么?为什么我的应用程序返回一个RolePrincipal而不是ClaimsPrincipal?我在哪里可以寻找线索?
我正在为此拔光我的头发!任何帮助都将不胜感激。

你可能仍然在引用会员时期的旧内容。请确保在您的Web配置文件中删除表单认证模块,禁用会员(如果适用),并从项目中删除WebMatrix等引用。 - jamesSampica
您真是个绝对的天才!我比较了这两个项目并删除了所有重要的汇编引用,现在它可以工作了。哇!我为此浪费了至少30个小时的生命!请将您的建议发布为正式答案,以便我将其标记为正确答案。 - yozepi
2个回答

13

发生的情况是您的旧应用仍然连接到旧的会员资格代码。一些清单项目应该能够帮助您恢复...

确保删除FormsAuthenticationModule(因为MVC5不再使用它)

<modules>
  <remove name="FormsAuthenticationModule" />
</modules>

确保关闭SimpleMembership(或者直接删除它)

<add key="enableSimpleMembership" value="false"/>

最重要的是删除对WebMatrix的引用(在MVC 5中不再使用)。 WebMatrix将自动注册预应用程序启动方法,尝试为您的项目提供成员资格服务。 详见此处


谢谢你,Shoe!正如我之前所说,你是个天才! - yozepi

5

我还必须删除RoleManager:

<modules>
  <remove name="FormsAuthentication" />
  <remove name="RoleManager" />
</modules>

谢谢!我认为最好将您的答案作为Shoe答案的编辑写入。 - Mahdi Ataollahi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接