我正在尝试找到在ASP.NET MVC中构建安全角色的最佳方法。
基本上角色是静态的(管理员,客户端,技术人员),但他们在每个部分可以做的是可配置的,添加/编辑/删除/查看。
例如,您可以将客户端的安全性配置为特定区域,例如用户帐户。
用户可以是任何角色的组合,因此可以成为客户和技术人员,并拥有两个用户的组合权限。
在ASP.NET MVC中执行此操作的合适方法是什么?
答案 0 :(得分:1)
我会告诉你这个决议:
数据库
用户表存储有关用户的信息,例如他们的姓名,电子邮件等。角色存储有关角色的信息,如名称,描述等.UserRoles只是一个查找表,可用于将特定用户与特定角色联系起来。
为了让您的代码能够使用这些表,您可以添加自定义角色提供程序,您将拥有2个方法的足够设施:public override string[] GetRolesForUser(string username)
和public override bool IsUserInRole(string username, string roleName)
。
当您完成后,您只需使用授权属性[Authorize(Roles = "Administrators")]
来检查用户是否有权访问特定操作或控制器,或者您可以使用Razor验证来显示/隐藏基于用户角色的某些HTML { {1}}
请查看以下链接以获取更多信息
答案 1 :(得分:1)
这就是我们这样做的方式
public enum YourUserRoles
{
None = 0,
Admin = 1,
Consumer = 2
}
public class YourAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
private readonly YourUserRoles[] _acceptedRoles;
public YourAuthorizeAttribute(params VoicelrUserRoles[] acceptedroles)
{
_acceptedRoles = acceptedroles;
}
public YourAuthorizeAttribute(params bool[] allowAll)
{
if (allowAll[0])
_acceptedRoles = new[] { VoicelrUserRoles.Admin, VoicelrUserRoles.Consumer };
}
public void OnAuthorization(AuthorizationContext filterContext)
{
if (SessionHelper.UserInSession == null)//user not logged in
{
string retUrl = filterContext.HttpContext.Request.RawUrl;
FormsAuthentication.SignOut();
filterContext.Result =
new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary {{ "controller", "home" },
{ "action", "index" },
{ "returnUrl", retUrl } });//send the user to login page with return url
return;
}
if (!_acceptedRoles.Any(acceptedRole => SessionHelper.UserInSession.Roles.Any(currentRole => acceptedRole == currentRole)))
{
filterContext.Result = new ViewResult
{
ViewName = "~/Views/Shared/Error.cshtml"
};
}
}
}
[YourAuthorize(YourUserRoles.Client )]
public ActionResult Whatever()
{
....
}
答案 2 :(得分:0)