如何将控制器类锁定为只能由一个或多个角色访问?我在第二个示例中尝试使用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}}
所以现在我想知道它是否是一个数据问题。任何想法???
答案 0 :(得分:2)
第二种方法
[Authorize(Roles="myrolename")]
是对的。如果用户没有该角色,则行为是提示他们使用具有访问权限的角色登录。如果您想要更改该行为,则必须使用自己的授权过滤器。
答案 1 :(得分:1)
如果访问该页面的用户未经过身份验证或者不是给定角色的成员(您的第二个选项是我使用的那个),那么他们将被重定向到身份验证页面。这是一个过滤器,而不是一个授权。