MVC3是正确的属性,只允许一个或多个角色访问一个类?

时间:2011-05-26 14:27:19

标签: c# asp.net asp.net-mvc-3 security

如何将控制器类锁定为只能由一个或多个角色访问?我在第二个示例中尝试使用AuthorizeAttribute,但它似乎强制要求授权,而不是授予对页面的访问权。

[PrincipalPermission(SercurityAction.?????????)]
public class MySecuredController { ...

OR

[Authorize(Roles="MyRoleName")
public class MySecuredController { ...

OR

我完全错了吗?

整个脚本它实际上只是MVC3教程......

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.IO;
using System.Security.Permissions; 

namespace mvc3test.Controllers
{
    [Authorize(Roles="taxpayer")]
    public class HomeController : Controller
    {

        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";
            return View();
        }

        public ActionResult About()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Index(HttpPostedFileBase dr405)
        {
            var saveLocation = Path.Combine(Server.MapPath("\\"),"returns");
            System.IO.Directory.CreateDirectory(saveLocation);
            dr405.SaveAs(Path.Combine(saveLocation,User.Identity.Name) + ".xlsx");
            ViewBag.Message = String.Format("File name: {0}, {1}Kb Uploaded Successfully.",dr405.FileName,(int)dr405.ContentLength / 1024); 
            return View();
        }

    }
}

当我运行此网站时,网站会在输入我的凭据后登录。我知道这是因为我的名字出现在屏幕的右上角。但它只是一遍又一遍地将我带到登录界面。

更新

因此,我在Redirect操作中的LogOn方法中添加了一个监视,其中User.IsInRole("taxpayer")的值为User.Identity.Name,其中User.IsInRole("taxpayer")是相关用户名。 USE [aspnetdb] GO DECLARE @return_value int EXEC @return_value = [dbo].[aspnet_UsersInRoles_GetUsersInRoles] @ApplicationName = N'/', @RoleName = N'taxpayer' SELECT 'Return Value' = @return_value GO 返回false。下面当我运行aspnet_db存储过程时,它表示列表中的用户返回.....

{{1}}

所以现在我想知道它是否是一个数据问题。任何想法???

2 个答案:

答案 0 :(得分:2)

第二种方法

[Authorize(Roles="myrolename")]

是对的。如果用户没有该角色,则行为是提示他们使用具有访问权限的角色登录。如果您想要更改该行为,则必须使用自己的授权过滤器。

答案 1 :(得分:1)

如果访问该页面的用户未经过身份验证或者不是给定角色的成员(您的第二个选项是我使用的那个),那么他们将被重定向到身份验证页面。这是一个过滤器,而不是一个授权。