作为索赔的替代品,我会推荐角色。如果你不确定如何做到这一点,请继续阅读。
如果您使用MVC创建了一个默认的Web应用程序,那么实体框架已经安装。假设你已经使用过代码优先迁移,那么EF也会为你设置你的数据库。
在这个过程中,它将添加一个类文件夹Migrations Configuration.cs。这个文件包含一个方法Seed,我们将在其中进行更改。这里
var userStore = new UserStore<ApplicationUser>(context);
var userManager = new UserManager<ApplicationUser>(userStore);
userManager.UserValidator = new UserValidator<ApplicationUser>(userManager) { AllowOnlyAlphanumericUserNames = false };
一个小秘密:
首先添加以下usings到Configuration.cs:
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.AspNet.Identity;
using Models; // assuming you have kept to the defaults
添加以下代码在种子功能。默认情况下,MVC5建立一个基于Email的用户系统。有趣的是,默认情况下,UserManager会检查UserName(与Email相同)是否不包含特殊字符(包括@)。因此需要关闭此功能。
添加一个角色,我们只是做:
context.Roles.AddOrUpdate(r => r.Name, new IdentityRole { Name = "MyRoleName" });
context.SaveChanges();
要将新用户添加到角色
if (!context.Users.Any(t => t.Email == "[email protected]"))
{
var user = new ApplicationUser { UserName = "[email protected]", Email = "[email protected]" };
userManager.Create(user, "Password#1");
context.SaveChanges();
userManager.AddToRole(user.Id, "MyRoleName");
}
到现有用户添加到角色:
var existingUser = context.Users.Where(u => u.UserName == "[email protected]").FirstOrDefault();
userManager.AddToRoles(existingUser.Id, "MyRoleName");
要应用这些更改,只需在包管理器窗口中运行update-database即可。
现在您有角色的用户可以限制任何你喜欢的动作,使用授权属性:
[Authorize(Roles ="MyRoleName")]
这些属性可以在类级别设置(开启/关闭整个控制器),或为个人行动。要设置多个角色,使用方法:
[Authorize(Roles ="MyRoleName, MyOtherRole")]
注意,这意味着任何人谁拥有两种角色正式授权。如果你想只授权有两个角色的用户,那么你必须做的:
[Authorize(Roles ="MyRoleName")]
[Authorize(Roles ="MyOtherRole")]
除了使用角色来限制访问您的控制器和动作,你也可以用它们来显示在查看/隐藏物品。例如,使用剃须刀:
@if (User.IsInRole("Admin"))
{
<p><a class="btn btn-danger btn-lg btn-block" href="@Url.Action("Index", "Administration")">Admin Area</a></p>
}
这有非管理员的优势,用户不会注意到他们错过了什么!
我们有类似的情况,一些用户是管理员,其他用户是客户,其他用户是信使和收件人。理赔应该适合您的情况。 –
它是否像所有类型的用户有共同的属性说电子邮件,电话号码和他们自己的具体属性像用户的类型作者有书的名单,但这个属性不需要任何其他用户类型?如果你可以证实这一点,我可以发布在我的项目中实施的解决方案。 –
您的用户是否真的具有不同的类型(例如,有不同的属性来描述每种类型的用户),还是他们在允许在系统中执行的操作中有所不同? –