基于MVC4角色的控制器的动作访问

时间:2013-06-10 09:08:50

标签: asp.net-mvc asp.net-mvc-4 authorization roleprovider

我想建立一个注册系统,在添加用户的同时,你可以选择你可以给他/她的角色类型。并且根据他/她的角色,将决定是否可以访问控制器中的某些动作。

例如,假设有两个角色,即管理员和开发人员。 如下所述,只允许具有管理员角色的用户访问以下操作。

[Authorize(Roles = "admin"]
public ActionResult CreateUser()
{
   return View();
}

据我所知,我必须实施自定义RoleProviderIPrincipal? 我试图找到一些例子,但没有得到我正在寻找的东西。 以下是我的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; }
    }

我希望在添加用户并使用自定义授权属性时决定角色。任何人都知道可以解决我的问题的文章或博客?或者任何建议,怎么做?

2 个答案:

答案 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...

我发现这种方法比滚动自己的实现更灵活(更快)。