到底如何在 Asp.NET MVC 4 中使用角色?

2023-12-25

我已经阅读了大量的文章和论坛,但我仍然无法弄清楚...... 我正在使用 Visual Studio Express 2012 for Web 和 MVC4+Razor+Entity Framework CodeFirst 构建一个互联网应用程序。

据我了解,使用 SimpleMembership 在 MVC4 中管理用户和角色比以前的版本更直接,应该相当简单。

在我的应用程序中,我需要仅授权某些用户组(例如,只有管理员可以访问某些页面)。我知道这是通过将参数传递给 [Authorize] 注释来实现的: [Authorize(Roles="Admins")] 但如何创建这些角色以及如何向其中添加用户?

为了需要身份验证我添加了注释[授权](没有参数)在控制器方法之上,它无需进行任何额外的配置或添加任何其他内容即可工作。另外,当我查看自动创建的数据库时,我看到一个名为webpages_UsersInRoles 的表,其中包含UserId 和RoleId 列。所有这些让我认为这必须是一个非常简单的任务,因为一切似乎都已设置好并准备好使用,但我只是不知道如何使用;)

到目前为止我尝试过的(但没有成功)是这样的: 我有一个继承自 DropCreateDatabaseIfModelChanges 的“DataContextDbInitializer”类。 Seed 方法在该类中被重写,我添加了这个(我必须导入 System.Web.Security):

Membership.CreateUser("user1", "123456");
Roles.CreateRole("Admins");
Roles.AddUserToRole("user1", "Admins");

我还在 Web.config 文件的标签中插入了这个标签:

<roleManager
enabled="true"
cacheRolesInCookie="true" >
</roleManager>

为了尝试一下,我在控制器中的操作方法之上添加了 [Authorize(Roles="Admins")],然后以“admin”身份登录并尝试访问该方法,但没有运气:(

我不知道我还缺少什么...... 如果有人能指导我完成这个,我会非常高兴,因为它让我发疯:P

Thanks!


我的猜测是你的 Seed 方法没有被调用。通过在方法中放置断点并在调试器中运行它来验证是否调用了该方法。除非您对应用程序进行了一些其他更改,否则不会使用 EF 迁移。默认情况下,数据库初始化为初始化SimpleMembershipAttribute。您将看到该属性已添加到帐户控制器中,如以下代码所示。

[Authorize]
[InitializeSimpleMembership]
public class AccountController : Controller
{
  ....
}

这样,只有当账户控制器被访问。您将在 Filters\InitializeSimpleMembershipAttribute.cs 中找到该定义。下面是这个类的一个代码片段,它可能可以解释为什么它没有被调用。

// Create the SimpleMembership database without Entity Framework migration schema
((IObjectContextAdapter)context).ObjectContext.CreateDatabase();

里面的很多代码初始化SimpleMembershipAttribute用于处理 MVC 应用程序不使用表单身份验证的情况。如果您始终使用表单身份验证,则可以消除此代码并自行初始化数据库。只需从 AccountController 中删除此属性并将您自己的初始化代码放入 Global.asax 中即可应用程序_启动方法。你可以添加这样的东西到应用程序_启动 method

Database.SetInitializer<UsersContext>(new MyDBInitializer());

种子方法看起来像这样

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

var roles = (SimpleRoleProvider)Roles.Provider;
var membership = (SimpleMembershipProvider)Membership.Provider;

if (!roles.RoleExists("Admin"))
{
     roles.CreateRole("Admin");
}
if (membership.GetUser("user1", false) == null)
{
     membership.CreateUserAndAccount("user1", "123456");
}
if (!roles.GetRolesForUser("user1").Contains("Admin"))
{
    roles.AddUsersToRoles(new[] { "user1" }, new[] { "Admin" });
} 

请注意,您需要初始化 Web 矩阵安全数据库Seed方法通过调用WebSecurity.InitializeDatabaseConnection method.

您可以在此处找到有关播种 SimpleMembership 的更多详细信息博客文章 http://kevin-junghans.blogspot.com/2013/01/seeding-customizing-aspnet-mvc.html,其中包括示例项目的完整源代码。

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

到底如何在 Asp.NET MVC 4 中使用角色? 的相关文章

  • 十六进制值 0X03 是无效字符

    这是一个网页的源码 p Da 32 brow 35 a G rn x3 icza p p 我需要浏览此页面并复制显示的文本 之后 我将此文本粘贴到 ASP NET MVC 应用程序的输入文本框中 以便在数据库中创建新记录 布局页面的元字符集
  • 如何像在iOS中一样在WP8中使用Prefix.pch?

    在 iOS 中 我有 5 个使用相同代码的应用程序 我能够引用公共类并使用 Prefix pch 文件中的值来分隔应用程序名称 主题和颜色 我的前缀文件有这些 define APPLICATION NAME Application01 de
  • MVC 对元素组强制进行 jQuery 验证

    我正在使用 MVC 4 设计的表单具有多个 DIVS 每个 DIVS 中有许多元素 我的目标是在用户填写字段时打开 关闭 DIVS 但是 我想对每个 DIV 而不是整个表单使用不显眼的验证 不单独检查每个元素是否可能 也许使用 DIV ID
  • 如何跟踪长时间运行的 IIS 调用?

    我们的用户焦躁不安 他们不断抱怨一些模糊的 无法衡量的东西 特别是缓慢 但没有给出具体细节 这当然使得追踪变得非常困难 尽管如此 他们很可能是对的 有些服务器调用需要很长时间才能返回 所以我想在网站上放置某种嗅探器 我们在 IIS7 上使用
  • EF5、SQL Server、经度和纬度

    我发现在 SQL Server 中存储纬度和经度的最佳类型是十进制 9 6 参考文献 1 在 SQL 数据库中存储纬度和经度数据时应使用什么数据类型 https stackoverflow com questions 1196415 wha
  • 如何在单击 ASP.NET 中的浏览器后退按钮时使会话过期

    这是我的场景 我有以下页面 1 登录页面 1 个母版页作为 ABC Master 3 个子页面为 第 1 页 第 2 页 第 3 页 第1页 第2页和第3页是母版页 ABC Master 的子页面 页面流程 输入用户名和密码后 如果单击 登
  • 如何在 MVC4 的 UserProfile 中创建自定义附加字段

    我遇到了新的 ASP MVC 4 功能 它附带了新的成员资格数据库模式和新的初始化 在 mvc 3 和旧版本中 开发人员能够使用 web config 中的规范创建自定义用户配置文件字段 但现在我面临默认 mvc 4 项目中过滤器命名空间中
  • Git 每次提交和拉取时都要求输入密码

    我正在使用带有 Git 扩展的 Visual Studio 2012 我正在使用位桶来存储项目 每次 每当我想要推送或拉取 Git 时 都会询问我帐户密码 在 Windows 8 中 Thanks 您可以使用gitcredentials h
  • pubxml Web 发布工具事件生命周期

    我正在使用 Visual Studio 2012 中的 Web 发布工具发布到文件系统 我了解到我可以打开 Properties 文件夹中的 pubxml 来执行更高级的操作 我想要做的是在发布任务结束时运行命令行应用程序 我通常会在自定义
  • Visual Studio 希望使用错误的平台工具集进行构建

    我已将解决方案从 VS2010 升级到 VS2012 我用其他解决方案做到了这一点 而且效果很好 但现在当我尝试构建更新的解决方案时 编译器告诉我 Error 1596 error MSB8020 The builds tools for
  • MSTest.exe (VS2012) 崩溃 QTAgent32.exe

    我正在尝试通过 cmdline 执行我们的测试 我使用VS2012 但总是出现此错误 当我在同一台机器上直接在 VS2010 中运行测试时 它们运行良好 我无法将 VS2010 用于 cmdline 因为我们的许可证错误 程序集查找不起作用
  • Visual Studio:如何正确构建和指定 x64 和 x86 的配置和平台

    使用 Visual Studio 2012 Professional 和 Ultimate 以及所有最新更新 如何正确指定配置和平台以正确构建 x86 和 x64 当您第一次创建 Winforms 应用程序时 Visual Studio 会
  • 为什么我的 COM 对象不显示组件服务中的方法?

    我正在尝试创建一个 COM 对象并将其注册到 COM 下 一切似乎都很顺利 但是当我查看组件服务并深入了解时 控制台根目录 组件服务 电脑 我的电脑 COM 应用程序 测试通讯 组件 TestCom Com MyCom 接口 MyCom 方
  • Visual Studio 智能感知搞砸了

    所以我是 MVC4 和 C 的新手 我已经设计这个网站大约两周了 智能感知没有任何问题 两天来 Visual studio 告诉我 Viewbag 和其他 命令不是我的项目的一部分 我可能错过了一些东西 或者它告诉我 Viewbag 在当前
  • 缺少添加控制器/视图的上下文菜单

    我已将 ASP NET MVC 4 集成到现有的 asp net 网站中 两者都工作正常 但我没有看到任何菜单 快捷方式来在 Visual Studio IDE 中创建控制器 视图 这些仅适用于 ASP NET MVC 模板吗 这些仅适用于
  • Elmah 不会在 MVC 应用程序中记录 http post 请求的异常 - 如果请求包含 XML

    我在 MVC4 RC 应用程序中遇到了一个奇怪的问题 在 NET 4 0上运行 我刚刚设置 Elmah 来记录异常 错误 我基本上安装了埃尔玛MVC and elmah sqlserverNuGet 包 分别为2 0 0和1 2版本 它似乎
  • 未找到 MSVCP110D.dll

    我正在尝试使用 SFML 制作游戏 我在 Visual Studio 2012 和 Windows 7 上完成了其中的一部分 我尝试在另一台使用 Windows XP 的 PC 上运行游戏 但出现错误 未找到 MSVCP110D dll 我
  • 如何在 MVC 应用程序中转置 Kendo UI 网格中的行和列?

    我在 MVC 应用程序中使用 Kendo Ui Grid 我希望在我的网格中显示多个国家 地区的统计数据 我从数据库检索数据的方式 我的网格将显示类似于以下内容的数据 Country Area Population GDP GDP Grow
  • 获取 SignalR hub 内的完整 URL

    我正在使用 SignalR 开发一个用户跟踪解决方案 作为学习 SignalR 的有趣项目 用于 ASP NET MVC 应用程序 目前我可以跟踪登录的用户以及他们在特定页面上停留的时间 如果他们移动到另一个页面 我也会跟踪该页面 并且 S
  • 如何将电子邮件类型的输入应用到 Asp.net MVC3 Razor 中的 HTML Helper

    如何将电子邮件类型的输入应用到 Asp net MVC3 Razor 中的 HTML Helper 例如

随机推荐