我试图找到在 ASP.NET MVC 中构建我的安全角色的最佳方法。
基本上角色是静态的(管理员、客户、技术人员),但他们在每个部分中可以做的事情是可配置的,添加/编辑/删除/查看。
例如,您可以为特定区域(如用户帐户)配置客户的安全性。
用户可以是任何角色的组合,因此可以是客户和技术人员,并拥有两个用户的组合权限。
在 ASP.NET MVC 中执行此操作的合适方法是什么?
我试图找到在 ASP.NET MVC 中构建我的安全角色的最佳方法。
基本上角色是静态的(管理员、客户、技术人员),但他们在每个部分中可以做的事情是可配置的,添加/编辑/删除/查看。
例如,您可以为特定区域(如用户帐户)配置客户的安全性。
用户可以是任何角色的组合,因此可以是客户和技术人员,并拥有两个用户的组合权限。
在 ASP.NET MVC 中执行此操作的合适方法是什么?
我会为您提供以下解决方案:
数据库
用户表存储有关用户的信息,例如他们的姓名、电子邮件等。角色存储有关角色的信息,例如其名称、描述等。用户角色只是查找表,您可以使用它来将特定用户与特定角色联系起来。
为了让您的代码使用这些表,您可以添加您的自定义角色提供程序,您将有足够的设施使用 2 种方法:public override string[] GetRolesForUser(string username)
和public override bool IsUserInRole(string username, string roleName)
.
完成后,您只需使用 Authorize 属性[Authorize(Roles = "Administrators")]
来检查用户是否有权访问特定操作或控制器,或者您可以使用 Razor 验证来根据用户角色显示/隐藏一些 html@User.IsInRole("Administrator")
请检查以下链接以获取更多信息
我们就是这样做的
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()
{
....
}