新的 MVC 4 Internet 模板中使用 simplemembership 进行基于角色的身份验证

2023-12-14

我喜欢 MVC 4 Internet 模板中新的 simplemembership 功能,其中包含用于 VS 2012 RTM 中外部登录的 OAuth 链接。大多数情况下,身份验证功能都可以正常工作。然而,即使花费了 8 个小时以上的时间,我也无法实现基于角色的授权来在我的控制器上工作。事实证明,SimpleMembership 一点也不简单。

我搜索了 stackoverflow、google 并阅读了最新的约翰·加洛韦,尝试了很多建议,仍然无法解决这个问题。这一切都是从 Sql 连接错误开始的,当连接字符串和其他一切都很好时,无法弄清楚为什么。我们花了很多时间才找出导致问题的 Roles 类。

控制器上的 [Authorize] 属性与以前一样用于基本身份验证。但任何时候我尝试使用 Roles 时都会出现 sql 连接错误(因为它恢复到旧的 DefaultRolesProvider,它尝试连接到默认的 SqlExpress aspnetdb 文件并失败)。所以像这样:

[Authorize(Roles="admin")]

不起作用。如果我回到旧的 asp.net 会员提供商,它会起作用,但随后我会丢失简单的数据库表、令牌基础确认和恢复、更安全的密码散列以及更重要的是通过 OAuth 的外部登录。

在代码和剃刀视图中唯一起作用的是

User.IsInRole("admin")

这对于菜单项等来说是可以的,但是在控制器中的每个操作中实现起来非常麻烦(而且我不喜欢它一次只测试单个角色)。

我将非常感谢任何解决此问题的指导。


找到了答案迈赫迪·戈尔钦 (Mehdi Golchin) 报道这似乎照顾:

[Authorize(Roles="admin,editor,publisher")]

如果我也将其添加到家庭控制器中:

 [InitializeSimpleMembership]

由于此属性位于帐户控制器上,因此仅在首次使用帐户控制器(例如登录/注册)后,SimpleMembership 数据库才会初始化。即使当前用户通过 cookie 登录,数据库也不会初始化,因此会抛出错误。一种解决方案是将此属性放在家庭控制器上,当我启动网站时会调用该属性。但是,然后需要将其放置在每个控制器上,因为我检查角色并根据角色显示不同的菜单项。

这是糟糕的设计,因为数据库应该在 App_Start 上初始化,而不是在第一次使用时初始化。

我确实尝试过

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

in the Global.asax Application_Start(),并且它负责使用菜单项中的角色检查User.IsInRole("admin"),但随后在任何控制器中抛出错误[Authorize(Roles="admin")]属性,即使有附加属性[InitializeSimpleMembership]被申请;被应用。

因此,现在的解决方案是将“[InitializeSimpleMembership]”放在所有控制器上,因为用户最初可能会使用外部链接登陆任何页面。

它仍然无法弄清楚如何初始化 SimpleRolesProvider 类来执行更多的角色管理而不仅仅是User.IsInRole().

这些东西在 webmatrix 网页站点中确实工作得更好,但显然 MVC 的移植并不完整。它与默认的 ASP.NET 成员资格提供程序发生冲突和混淆。

EDIT好吧,我没想到[InitializeSimpleMembership]可以通过将此行放在全局范围内应用过滤器FilterConfig.cs在App_Start文件夹中:

filters.Add(new InitializeSimpleMembershipAttribute());

这就解决了这个问题。现在需要一个用于 SimpleRolesProvider 初始化的解决方案,否则我将不得不编写自己的角色提供程序。

UPDATE:

This 斯科特·艾伦发表的文章解决了我所有的问题。

通过将其包含在 web.config 中:

<roleManager enabled="true" defaultProvider="simple">
  <providers>
    <clear/>
    <add name="simple" type="WebMatrix.WebData.SimpleRoleProvider,               WebMatrix.WebData"/>
  </providers>      
</roleManager>
<membership defaultProvider="simple">
  <providers>
    <clear/>
    <add name="simple" type="WebMatrix.WebData.SimpleMembershipProvider,                          WebMatrix.WebData"/>
  </providers>
</membership>

Roles 和 Membership 类的所有方法都可用,并且可以在代码中初始化,如下所示:

var roles = (SimpleRoleProvider) Roles.Provider;
var membership = (SimpleMembershipProvider) Membership.Provider;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

新的 MVC 4 Internet 模板中使用 simplemembership 进行基于角色的身份验证 的相关文章

  • MVC 中的外键注释

    我有两张桌子 State StateID int StateName string City CityID int StateID int CityName string 我正在使用代码优先方法开发 MVC4 代码 我正在使用State a
  • 我们已经让 MEF 与 MVC4 一起工作,那么基于约定的模型怎么样?

    经过深入研究 我发现可以在 MVC4 中使用 MEF 进行 DI 下面的 SO 链接给出了几个示例 如何将 MEF 与 ASP NET MVC 4 和 ASP NET Web API 集成 https stackoverflow com q
  • 验证仅适用于数组的第一项

    给定这个模型代码 Required Display Name Name public string Name get set 以下查看代码有效 Html LabelFor model gt model Name Html TextBoxFo
  • 从一个项目调用控制器到另一个项目

    我正在使用 Asp net MVC4 和 razor 我想知道如何在同一解决方案中从一个项目调用控制器到另一个项目 我是 MVC4 的新手 您可以简单地将控制器添加到另一个项目 类库或 MVC 项目等 我们有几个共享控制器的项目 webAP
  • ASP.NET MVC 4 会话超时

    我正在使用 VS 2012 IIS 7 5 开发一个带有 ASP NET MVC4 的互联网应用程序 我正在使用表单身份验证 我的网络配置中的设置如下
  • ASP.NET MVC 中的异步控制器

    我检查了 MVC 4 0 中的 System Web Mvc AsyncController 它有注释 提供与 ASP NET MVC 3 的向后兼容性 这是否意味着 MVC 4 中有异步控制器的新实现 MVC 4 0 启用异步控制器以便将
  • Microsoft ASP.NET Web Pages 2 Data Nuget 包的用途是什么?

    据我了解 ASP NET MVC 4 项目所需的最低 Nuget 包是 微软 ASP NET MVC 4 微软 ASP NET 剃刀 2 微软 ASP NET 网页 2 微软网络基础设施 不过我很想知道 以下包会添加到项目中什么 Micro
  • CS1003:语法错误,Razor 中应为“>”

    我正在尝试一些新的东西 对我来说 为我的布局视图模型使用抽象基类 问题是 当我按原样运行该网站时 它会抛出一个非常神秘的 对我来说 异常 这个异常是什么意思 我可以采取什么措施来解决它 Layout model MyApp Core Vie
  • MVC4 中的 ELMAH 和 API 控制器不记录错误

    在 MVC4 中使用 API 控制器 当控制器操作引发异常时 ELMAH 不会记录错误 我认为问题在于 MVC4 将 HTTP 状态代码设置为 500 并且它返回 JSON 对象中的异常详细信息 但它不会抛出未处理的异常 因此 ELMAH
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • 字段“日期”必须是日期 MVC 4

    当我使用 jQuery 日期选择器时 我遇到了这个错误 jQuery datepicker datepicker defaultDate 7 autoSize true dateFormat dd mm yy Model DisplayNa
  • 使用 ImageResizer 获取图像尺寸的最佳方法

    我正在将现有的 MVC 4 网站从自制用户文件上传切换为在上传时使用 ImageResizer 调整文件大小 我在文档中看到我不应该使用 System Drawing 但我无法找出任何其他获取图像尺寸的方法 尺寸是来自原始图像还是调整大小的
  • 使用 MSBuild 12 构建 MVC 4.0 项目时“任务失败,因为未找到 AXImp.exe”

    我正在尝试使用 CruiseControl Net 和 MSBuild 设置构建服务器 但是 它失败并出现错误 C Builds PremiumStore checkout PremiumStore sln default target 1
  • 有条件地在 html.RadioButtonFor (MVC4/Razor) 中包含选中的属性

    当您在手动编码的 html 元素 例如单选按钮 中显式包含 checked 属性时 您可以使用 bool 来确定该属性是否存在于该元素上正如这里所看到的 http www davidhayden me blog conditional at
  • MVC4更新部分视图

    我正在开发一个简单的 MVC 应用程序 我有主视图 部分视图和控制器 这是我的主要视图 model partitalViewTest Models Qset div class transbox style height 1 Html Pa
  • MVC4 捆绑:由于 css3 功能而缩小失败?

    我想使用 MVC4 捆绑和缩小 但我总是在未缩小的 css 文件中收到此错误消息作为注释 Minification failed Returning unminified contents 534 29 run time error CSS
  • 当checked属性为false时,单选按钮默认被选中?

    我正在尝试生成单选按钮 有条件地检查检查的属性 如果该值存在于数据库中 则应选择它 否则检查的属性为 false 所以最初数据库中没有行 所有单选按钮的检查属性也为 false 但仍然在 UI 上选择 请参见下图 所以不知道这是默认行为还是
  • 编辑用户个人资料详细信息

    如何创建用于编辑用户自定义信息的操作和视图 授权基于 VS 通过 MVC 4 项目创建的成员资格 我添加了其他列 例如 FirstName 等 我需要并且注册工作正常 但我不知道如何让此属性显示在视图中 Html EditorFor并将更改
  • 如何在编辑器模板中获取序列/数组索引?

    案件 我有一个使用 X 类编辑器模板显示的 X 类项目列表 问题 如何获取编辑器模板内部正在处理的项目的索引 我一直在使用这个 HtmlExtension 它只返回迭代所需的 id 它基本上是一个正则表达式ViewData Template
  • 从 ApiController 中的 json 序列化中排除属性

    我试图在 Web ApiControllers 中排除属性被序列化为 JSON 我已经验证了以下 2 个场景的工作原理 我已在我希望排除的属性中包含以下属性 System Web Script Serialization ScriptIgn

随机推荐