的一种方式做,这是打造特色。例如View Orders, Create Order, Update Order, Delete Order
这些features
将被分配到一个Role
- 和角色可以被分配到一个User
所以DB会是这个样子:
现在,当用户登录后,读取分配给用户的所有功能并将它们保存在会话中(创建SessionHandler类)。 UserDTO类
样品
SessionHandler
public class SessionHandler
{
private const string SessionKey = "UserSession";
public static UserDTO UserSession
{
get
{
return HttpContext.Current.Session[SessionKey] != null
? (UserDTO)HttpContext.Current.Session[SessionKey]
: null;
}
set { HttpContext.Current.Session[SessionKey] = value; }
}
}
所以在你的控制器
public class UserDTO
{
public int UserId {get;set;}
public List<string> Features {get;set;}
}
的
// Login Function - You can call from Controller
public UserDTO Login(string username, string password)
{
var user = dbContext.Users.FirstOrDefault(s => s.Username == username && s.Password == password);
if(user == null) return null; // login failed
var model = new UserDTO()
{
UserId = user.UserId,
Features = user.Role.Features.Select(s => s.FeatureName).ToList()
};
return model;
}
样品致电Login
功能和SessionHandler
[HttpPost]
public ActionResult Login(LoginModel model)
{
var user = Login(model.username, model.password);
if(user == null) return View(model);
SessionHandler.UserSession = user;
// TODO: redirect to Home Page - after login
return RedirectToAction("Index", "Home");
}
分配给
然后,您可以在视图中执行的操作是检查用户是否可以执行特定操作,例如,如果你是查看订单页面上 - 你可以隐藏创建订单按钮,如果用户没有权限:
@model WhateverDTO
// Check if user has Create Order Feature in Role
@if (SessionHandler.UserSession.Features.Contains("Create Order"))
{
// Yes, User has permission - then Render the Button
<button> Create Order </button>
}
您也可以在控制器(服务器端)添加检查 - 这将提供额外的安全性您应用程序,使用该授权属性:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext == null)
throw new ArgumentNullException("httpContext");
if (httpContext.Session == null)
return false;
// Checking Authenticaiton
var userSettings = SessionHandler.UserSession;
if (userSettings == null)
return true;
//Checking Authorization
if (Roles.Length == 0)
return true;
var actionFeatures = Roles.Split(',');
if (!actionFeatures.Any(s => userSettings.Features.Contains(s)))
throw new UnauthorizedAccessException("You do not have permission to perform this action.");
return true;
}
}
,然后装点您的操作,
[CustomAuthorize(Roles = "Create Order")]
// Pass feature name for Roles - if user doesn't have permission to Create Order - the "You do not have permission to perform this action." exception will get thrown
public ActionResult CreateOrder()
{
return View(new CreateOrderDTO());
}
[HttpPost]
[CustomAuthorize(Roles = "Create Order")]
// Pass feature name for Roles - if user doesn't have permission to Create Order - the "You do not have permission to perform this action." exception will get thrown
public ActionResult CreateOrder(CreateOrderDTO model)
{
return View(model);
}
关于上述方法的好处 - 是,你可以添加尽可能多的用户角色因为你需要 - 而不需要改变代码。
模型 - 我觉得这一个保持为一个与数据库
模型是相同的 - 相同的DB同型号
的ViewModels - 我写的每个角色不同的看法?如果是这样,2个文件/类?
不,不要复杂的事情 - 用同一视图模型/ DTO
控制器 - 一样,不用我写不同的功能?类?如果是这样,那么[授权角色]有什么意义,只是为了防止未经授权的访问&不打算分裂?
无需单独行动/观点或控制器
意见 - 我尝试使用的大部分地区相同的看法,只是不知何故包括逻辑,如果他们有“编辑”按钮或不?
是,使用同样的观点 - 隐藏/基于用户角色/显示操作功能
局部视图 - 它们可以被用于“编辑”按钮,可能会或可能不会对看法?
无需为按钮
视图布局部分观点 - 过滤器 - 我可以做一些花哨的逻辑,并将所有内容放在完全2个不同的文件夹中(整个MVC),然后在路由/授权级别分割它 路由 - ?
否
{授权]只允许或不允许访问动作/控制器。您可以在视图中检查用户角色,并根据角色隐藏或显示不同的操作, –