2016-09-21 60 views
-1

上,阅读有关角色和声明身份的文章,但还没有弄清楚许多事情。所以非常好奇,要知道当我们将使用身份与索赔时,用户访问权是如何实现的。ASP.Net MVC:如何将声明权限附加到角色

当我们使用角色时,我们用单个或多个角色名称来装饰动作。如果用户具有该角色,则用户可以访问该操作,否则不像下面的代码。

[AuthLog(Roles = "Manager")] 
public ActionResult Create() 
{ 
    var Product = new ProductMaster(); 
    return View(Product); 
} 

我想当我们使用身份和声明工作时,必须有一些方法来将角色或权限附加到每个动作(如角色)。如果存在任何这样的事情,请分享这个想法如何用好的示例代码或提供文章链接来实现。谢谢

+1

当您使用带有声明的令牌(例如oAuth)时,该令牌将拥有一个名为“角色”的声明。当您的网站收到此令牌时,它将负责创建主体对象并根据角色声明中的角色设置角色。然后,您将能够继续使用标准的'AuthorizeAttribute'或您自定义的'AuthLogAttribute' –

+0

我对这方面的知识很少。你可以将我引导到任何详细讨论和指导的文章。谢谢 –

回答

0

这是自定义的授权从数据库检查权限。 例如,你有3个布尔变量的权限的帐户,客户端,配置 你想限制继的ActionResult

线,您可以添加,甚至允许在一个动作两个基于他们比地方的用户,比如你有一个方法这可以通过帐户和客户端权限进行访问比您可以添加以下行

[PermissionBasedAuthorize("Client, Account")] 

下面这个方法是从数据库查询的bool。

public class PermissionBasedAuthorize : AuthorizeAttribute 
{ 
    private List<string> screen { get; set; } 

    public PermissionBasedAuthorize(string ScreenNames) 
    { 
     if (!string.IsNullOrEmpty(ScreenNames)) 
      screen = ScreenNames.Split(',').ToList(); 
    } 

    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
     base.OnAuthorization(actionContext); 
     var UserId = HttpContext.Current.User.Identity.GetUserId(); 
     ApplicationContext db = new ApplicationContext(); 

     var Permissions = db.Permissions.Find(UserId); 

     if (screen == null || screen.Count() == 0) 
     { 
      actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized); 
     } 

     bool IsAllowed = false; 

     foreach (var item in screen) 
      foreach (var property in Permissions.GetType().GetProperties()) 
      { 
       if (property.Name.ToLower().Equals(item.ToLower())) 
       { 
        bool Value = (bool)property.GetValue(Permissions, null); 
        if (Value) 
        { 
         IsAllowed = true; 
        } 
        break; 
       } 
      } 

     if (!IsAllowed) 
     { 
      actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized); 
     } 
    } 
}