Pau*_*aul 12 c# asp.net-mvc asp.net-mvc-4
我有一个系统,其中所有页面(视图)和所有控件(按钮,链接,菜单itens ...)都应用了安全角色.
所以我有一个管理界面,其中所有页面和控件都已注册.每个用户都有一组个人权限.
所以,例如:
我有一个View EditCar,有3个按钮:"New","Delete"和"Back".
因此,用户X有权查看View EditCar,只有"Back"按钮
因此,必须注册每个新视图,并与用户相关联.没有角色,因为每个用户都是100%可配置的.
所以,我有一个FilterAttribute:
public class CustomAuthorize : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAuthenticated)
{
var userPermissions = repository.GetAll().Where(x => x.Name.Equals(User.Identity.Name);
// if (!userPermissions.Pages.Any(x => x.NamePage.Contains(???))))
}
else
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是: - 我应该在数据库中保留什么来识别每个视图(动作)?也许3个值?区域控制器,行动?
这是最好的选择吗?有关该解决方案的任何其他想法
谢谢
我的Web应用程序中有相同的场景,它的工作方式如下:
我们在数据库中:
权限包含查看,添加,编辑,删除
功能包含可以设置为角色的所有功能
FeaturePermission使用权限绑定该功能,例如哪个功能具有什么特权
UserRole具有用户的角色
RoleFeaturePermission显示哪个角色具有允许的权限
现在在代码中,当用户进行身份验证时,我生成了使用功能分配给它的权限列表,然后我定义了一个Enum,如:
public enum FeatureValue
{
Custom = 1,
Schedule = 2,
Export=3
}
public enum PermissionValue
{
View = 1,
Add = 2,
Edit = 3,
Delete = 4
}
Run Code Online (Sandbox Code Playgroud)
以及获得授权的UserPermission静态类:
public static bool VerifyPermission(FeatureValue feature, PermissionValue permission, int id) {
return getFeaturePermissionsForReport(feature, permission, id);
}
private static bool getFeaturePermissionsForReport(FeatureValue feature, PermissionValue permission, int id) {
SessionHelper sessionHelper = new SessionHelper(null);
UserModel userModel = sessionHelper .getUser()//get user from session.
if (userModel != null && userModel.IsAuthorized == false) return false;
UserProfile userProfile = sessionHelper.Get<UserProfile> ();
if (userProfile != null && userProfile.AssignedRoleList != null) {
List<Core.Entities.FeaturePermission> featurePermission = userProfile.AssignedRoleList.SelectMany(b => b.RoleFeaturePermission).ToList();
if (featurePermission != null) {
if (featurePermission.Count(f = > f.Feature.Id == (int) feature && f.Permission.Id == (int) permission) > 0) {
bool isAllowed= false;
int featurePermissionId = featurePermission.Where(f = > f.Feature.Id == (int) feature && f.Permission.Id == (int) permission).Select(i = > i.Id).FirstOrDefault();
isAllowed = (reports.Count(r = > (r.FeaturePermissionId == featurePermissionId && r.Id == id)) > 0) ? true : false;
return isAllowed;
}
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
现在每个链接,按钮或动作使用一个:
@if (UserPermission.VerifyPermission(FeatureValue.Custom, PermissionValue.Edit))
{
//action link to edit custom view
}
Run Code Online (Sandbox Code Playgroud)
对于动作自定义属性是:
[AttributeUsage(AttributeTargets.All,AllowMultiple=true)]
public class CustomFeaturePermissionAttribute : ActionFilterAttribute
{
private FeatureValue[] feature;
private PermissionValue[] permission;
private bool excludeParamId;
/// <summary>
/// Set values of featurelist and permission list
/// </summary>
/// <param name="featureList"></param>
/// <param name="permissionList"></param>
public CustomFeaturePermissionAttribute(object featureList,object permissionList, int excludeParamId)
{
FeatureList = (FeatureValue[])featureList;
PermissionList = (PermissionValue[])permissionList;
ExcludeParamId = excludeParamId;
}
public FeatureValue[] FeatureList
{
get
{
return feature;
}
set
{
feature = value;
}
}
public bool ExcludeParamId
{
get
{
return excludeParamId;
}
set
{
excludeParamId = value;
}
}
public PermissionValue[] PermissionList
{
get
{
return permission;
}
set
{
permission = value;
}
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
bool isAccessAllowed = false;
FeatureValue feature;
PermissionValue permission;
for (int i = 0; i < FeatureList.Count(); i++)
{
feature = FeatureList[i];
permission = PermissionList[i];
isAccessAllowed = UserPermission.VerifyPermission(feature, permission, Convert.ToInt16(ExcludeParamId));
if (isAccessAllowed)
break;
}
if (!isAccessAllowed)
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { action = "UnauthorizedAccess", controller = "Security" }));
}
}
}
Run Code Online (Sandbox Code Playgroud)
和on actions允许角色拥有查看权限而不是自定义和导出:
[CustomFeaturePermission(new FeatureValue[] { FeatureValue.Custom, FeatureValue.Export }, new PermissionValue[] { PermissionValue.View, PermissionValue.View},pageId)]
public ActionResult Custom()
{
//action body
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4612 次 |
最近记录: |