3

在我的应用程序中,角色有几个权限。我希望用户有权访问取决于权限的操作,而不是角色。自定义授权(权限)ASP.NET MVC

因此,假设:

  • 管理员拥有PERM1,PERM2,perm3,
  • 超级管理员具有管理员具有+ perm4和perm5所有的任何权限。
  • 此外,还有一些轻微的家伙也有perm1,perm3,perm6,perm7。

我想要做以下事情:我想让行动可以通过假设perm3或perm4的人访问。这两个权限来自两个不同的角色。但在perm3 Admin中有perm1和perm2,这个动作也可以由拥有perm3的小个子访问(它不一定是admin或superadmin)。

那你明白我说的对吗?我想在ASP.NET MVC 4中实现这一点。因此,我想我需要制作自己的AuthorizeAttribute,我自己的IIdentity并在global.asax中编写一些方法。 ASP.NET中还有一个成员我是否需要触摸它?我不知道如何把所有的东西放在一起。谁能帮我吗?

+0

您可能想要去与asp.net的内置feautre这是基于声明的身份验证。 Follow link for more details http://visualstudiomagazine.com/articles/2013/08/01/leveraging-claims-based-security-in-aspnet-45.aspx – hungrycoder

回答

1
public class PermissionAttribute : AuthorizeAttribute 
    { 
     private readonly IAccountService _accountService; 
     private readonly IEnumerable<PermissionEnum> _permissions; 

     public PermissionAttribute(params PermissionEnum[] permissions): 
      this(DependencyResolver.Current.GetService<IAccountService>()) 
     { 
      _permissions = permissions; 
     } 

     protected PermissionAttribute(IAccountService accountService) 
     { 
      _accountService = accountService; 
     } 

     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      if(!_permissions.Any(x=>_accountService.HasPermission(filterContext.HttpContext.User.Identity.Name,(int)x))) 
       filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.Forbidden); 
      base.OnAuthorization(filterContext); 
     } 

    } 
1

基本上你必须创建自己的AuthorizeAttribute,但是使用.NET的IIdentity。您在这里描述的是基于声明的身份验证和授权系统。

很有可能你必须从ASP.NET中扔掉成员资格或仅使用它的一部分。据我所知,它不是建立在索赔的基础上。

在.NET 4.5中,人们添加了类:ClaimsPrincipal,它实现了IPrincipal接口。这个类可以用来实现基于声明的定制认证和授权。后来

var id = new ClaimsIdentity(claims, "Dummy"); 
var principal = new ClaimsPrincipal(new[] { id }); 
Thread.CurrentPrincipal = principal; 

,然后只用你在找Thread.CurrentPrincipal中的要求:

因此,当用户通过验证后,就可以在线程上添加索赔。

在ASP.NET MVC中,你可以做以下步骤:

  1. 创建委派处理程序,其对用户进行认证。如果用户通过身份验证,则将声明添加到线程主体。理想情况下,这个委托处理程序应该尽可能高,以便您可以在执行链中随处可用。还记得设置HttpContext.Current.User具有相同的主要

    公共类AuthHandler:DelegatingHandler {

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
    //authenticate user 
    //get claims 
    //create principal 
    var newPrincipal = CreatePrincipal(claims); 
    Thread.CurrentPrincipal = newPrincipal; 
    if (HttpContext.Current != null) 
        HttpContext.Current.User = newPrincipal; 
    return await base.SendAsync(request, cancellationToken); 
    } 
    

    }

  2. 创建其授权基础上加入线程权利要求的过滤器主要。在这里你可以做一些比较当前路线和索赔中找到的信息。

0

因此,我认为你说的是​​:ActionA只能访问,如果用户有PERM1,PERM2,同样ActionB是可访问的,当用户有PERM1和perm3

我给的代码是为了说明,我没有编译它。但是会给你方法的画面我很说明

STEP 1:您可以创建具有标志归因权限枚举进行属性

STEP 2:加入声称目前的主要依据用户权限存储在数据存储中。

步骤3:当操作被调用针对权利要求

[Flags] 
    enum PermType 
    { 
     None = 0x0, 
     Perm1 = 0x1, 
     perm2 = 0x2, 
     perm3 = 0x4, 
     perm4 = 0x8, 
     perm5 = 0x10 
    } 

添加的权利要求书中所述CurrentPrincipal

var currentPrincipal = ClaimsPrincipal.Current; 
var cms = currentPrincipal.Claims; 
var permissions = PermType.Perm1 | PermType.perm2; 
var claims = cms.ToList(); 
claims.Add(new Claim("Action1", permissions.ToString())); 
claims.Add(new Claim("Action2", permissions.ToString())); 
claims.Add(new Claim("Action3", permissions.ToString())); 
System.Threading.Thread.CurrentPrincipal = new ClaimsPrincipal(new ClaimsIdentity(claims)); 

检查授权访问如果用户可以访问的特定动作

public bool CanAccessThisAction(string acionName,PermType requiredPerms) 
{ 
    var claim = principal.Claims.FirstOrDefault(c => c.Type == acionName); 
    if (customPermissionClaim != null) 
    { 
     //check if required permission is present in claims for this user 
     //return true/false 
    } 
    return false; 
} 

行动

public ActionResult TestAction(string id) 
{ 
    if(CanAccessThisAction("TestAction",PermType.Perm1|PermType.perm3|PermType.perm5)) 
    { 
     //do your work here 
    } 
    else 
    { 
     //redirect user to some other page which says user is not authorized 
    } 
} 
+0

你也可以尝试一下“ClaimsAuthorizationManager”http:///msdn.microsoft.com/en-us/library/system.security.claims.claimsauthorizationmanager.aspx –