我想建立一个注册系统,在添加用户的同时,你可以选择你可以给他/她的角色类型。并且根据他/她的角色,将决定是否可以访问控制器中的某些动作。
例如,假设有两个角色,即管理员和开发人员。 如下所述,只允许具有管理员角色的用户访问以下操作。
[Authorize(Roles = "admin"]
public ActionResult CreateUser()
{
return View();
}
据我所知,我必须实施自定义RoleProvider
或IPrincipal
?
我试图找到一些例子,但没有得到我正在寻找的东西。
以下是我的RegisterModel目前的样子
public class RegisterModel
{
[Key]
public Guid Id;
[Required]
[Display(Name="First Name")]
public string FirstName {get; set;}
[Required]
[Display(Name="Last Name")]
public string LastName {get; set;}
[Required]
[Display(Name="Email Id")]
[DataType(DataType.EmailAddress)]
public string EmailId {get; set;}
[Required]
[Display(Name = "User name")]
public string UserName { get; set; }
[Required]
[Display(Name = "Password")]
[DataType(DataType.Password)]
public string Password { get; set; }
[Required]
[Display(Name = "Confirm Password")]
[DataType(DataType.Password)]
public string ConfirmPassword { get; set; }
[Required]
[Display(Name = "Role")]
public UserRole Role { get; set; }
}
public class UserRole
{
[Key]
public int RoleId { get; set; }
public string RoleName { get; set; }
}
我希望在添加用户并使用自定义授权属性时决定角色。任何人都知道可以解决我的问题的文章或博客?或者任何建议,怎么做?
答案 0 :(得分:5)
最近,我实施了角色授权,但没有使用会员提供商。认为这可能会对你有所帮助。我有一个包含UserName,Password和Role的数据库表,我需要检查数据库中的角色。
以下是我的自定义RoleFilter类。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcApplicationrazor.Models.ActionFilters
{
public class RoleFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (GetCurrentUserRole() != "Admin")// Check the Role Against the database Value
{
filterContext.Result = new RedirectResult("~/Redirect/NoPermission");
return;
}
}
}
}
<强>控制器:强>
[RoleFilter]//Check the Role, if not allowed redirect to NoPermission view
public ActionResult Index()
{
return View();
}
答案 1 :(得分:1)
MVC 4使用WebMatrix的一些帮助程序类来实现安全性和成员资格。你可以在这里阅读一个非常好的教程: http://www.asp.net/web-pages/tutorials/security/16-adding-security-and-membership
如果您没有任何特殊要求,通常不值得提出您自己的角色提供程序实现。
祝你好运!
编辑:快速补习
以下内容基于名为“UserProfile”的Model类,其中相应的表名称相同。该表有一个名为“UserId”的列用于id,一个名为“UserName”用于登录。当然它可以包含您需要的所有信息,但这些是WebSecurity初始化数据库所需的唯一信息。
第1步:web.config。把它放在system.web
部分。这指示ASP.NET使用两个Simple
提供程序进行角色和成员身份:
<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>
第2步:Application_Start。为角色和成员资格表添加数据库初始化:
protected void Application_Start()
{
try
{
// Initializes the DB, using the "DefaultConnection" connection string from the web.config,
// the "UserProfile" table, the "UserId" as the column for the ID,
// the "UserName" as the column for usernames and will create the tables if they don't exists.
// Check the docs for this. Basically the table you specify
// is a table that already exists and where you already save your user information.
// WebSecurity will simply link this to its own security info.
if (!WebSecurity.Initialized)
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
}
catch (Exception ex)
{
throw new InvalidOperationException("Cannot init ASP.NET Simple Membership database", ex);
}
}
当InitializeDatabaseConnection
第一次触发时,它将创建4个表:
webpages_Membership
webpages_OAuthMembership
webpages_Roles
webpages_UsersInRoles
第3步:您现在可以使用“授权”属性:
[Authorize(Roles="Admin")]
此外,您现在可以使用许多方法来创建和登录用户:
WebSecurity.CreateUserAndAccount(model.UserName, model.Password); // to create users. You can also pass extra properties as anonymous objects
WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe); // for logins
WebSecurity.Logout();
WebSecurity.ChangePassword(User.Identity.Name, model.OldPassword, model.NewPassword);
// and so on...
我发现这种方法比滚动自己的实现更灵活(更快)。