我正面临一个案例,我已经研究了很多,我仍然找不到解决方案。 我已经完成了在ASP.NET MVC 1应用程序中完成角色实现的任务。 这里的案例反对在应用程序中的权限时通常所做的事情。 让我们假设我们在一个5页的网站中有两个角色,运营商和经理。让一个用户继承这两个角色,我想允许和拒绝根据以下模式查看页面的权限:
对于第1页,Operator角色允许用户查看,但Manager角色拒绝;在这种情况下,我想让拥有这两个角色的用户查看页面;
对于第2页,Operator角色拒绝用户查看,Manager角色也会拒绝;当两个角色都拒绝用户查看页面时,这是我真正想要拒绝某个角色的唯一情况。
因此,每当用户继承多个角色时,应该确定他无法查看某个页面的内容是完全拒绝(拒绝其所有角色),并且每当他有一个允许的角色时,即使他的所有其他角色也是如此如果角色拒绝,他仍然可以查看该页面。
有谁知道如何实现这个?
编辑:
以下只是我们的应用程序中如何完成授权的一瞥,除了站点地图中使用的内容。 您可以看到下面的规则使用多个配置文件。我上面描述的情况需要与下面的实现一起使用。
<Rules xmlns="urn:artemis.runtime.web.security">
<!-- RUNTIME -->
<Rule roles="*" resource="^Artemis\.Runtime\.Web\.FilesController\..*" permission="Allow" />
<!-- ABERTURA GERAL -->
<Rule roles="*" resource="^Tagus\.Logistics\.Web\.Controllers\..*" permission="Allow" />
<Rule roles="Gestor Cliente,DUN" resource="^Tagus\.Logistics\.Web\.Controllers\.PlanningVsEffectiveController\..*" permission="Deny" />
</Rules>
答案 0 :(得分:3)
[Authorize(Roles = "Operator")]
public ViewResult PageOne(){
return View();
}
[Authorize(Roles = "SomeOneElse")]
public ViewResult PageTwo(){
return View();
}
如果我理解正确,你不会查看第二页的任何角色吗?
答案 1 :(得分:1)
授权用于决定允许谁拒绝。如果你想添加拒绝功能,我想你可以制作一个自定义的Authorize属性。类似的东西:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited=true, AllowMultiple=true)]
public class DenyRolesAttribute : AuthorizeAttribute
{
public DenyRolesAttribute(string roles) : base()
{
Roles = roles;
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext == null)
{
throw new ArgumentNullException("httpContext");
}
IPrincipal user = httpContext.User;
if (!string.IsNullOrEmpty(Roles) && Enumerable.Any<string>(Roles.Split(','), new Func<string, bool>(user, (IntPtr) user.IsInRole)))
{
return false;
}
return true;
}
}
我在现场做了这个,所以一定要测试并整理一下。或者可以添加AllowRoles和DenyRoles属性,以便在重写的AuthorizeCore方法中执行两者操作。你明白了这个想法