MVC5中基于声明的身份验证

时间:2014-11-20 19:30:38

标签: asp.net-identity

在我的应用程序中,有三种类型的用户。 Admin,SuperAdmin,普通用户。我想在没有角色概念和使用声明的情况下进行身份验证。在db.net中有一个名为AspNetClaims的表用于asp.net标识。如何用索赔填写此表?首次注册用户时,应为其分配声明(admin,superadmin,user)。然后,接下来,当用户登录时,我必须能够找到用户的类型。我怎么能实现它?

我的另一个问题是:在这种情况下,在没有任何角色概念的情况下进行基于声明的身份验证是否正确?

2 个答案:

答案 0 :(得分:1)

步骤1:您必须对以下示例

的操作方法应用过滤器

这是我的Action方法:

[AuthAttribute]
        [CustomAuthorize("Admin", "SuperAdmin")]
        public ActionResult GetEmployeeList(string sortOrder, string currentFilter, string searchString, int? page)
        {

            List<GetListviewData_Result> listGetListviewData_Result = db.GetListviewData().ToList();
return view(listGetListviewData_Result);
}

步骤2:你必须在你的授权过滤器方法中编写代码,如下面的例子

这是我的授权过滤器:

protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            var userEmailId = httpContext.Session["userName"];
            bool authorize = false;
            foreach (var role in allowedroles)
            {
                /* getting user form current context */
                var user = context.user_tbl.Where(m => m.emailId == userEmailId  && m.role == role);
                if (user.Count() > 0)
                {
                    authorize = true; /* return true if Entity has current user(active) with specific role */
                }
            }
            return authorize;
        }

答案 1 :(得分:0)

如果您只是想让某些类型的用户可以使给定类型的所有用户具有相同的权限(而不是例如用户对不同数据记录的权限不同),那么您实际上就像使用基于角色的权限而不是基于声明的权限一样。

使用声明的关键在于它允许您通过角色等执行您可以执行的所有操作。声明为您提供更多灵活性:例如您的数据库可能包含多个不同客户端(ClientA和ClientB)的数据,每个客户端都可以拥有管理员用户(例如AdminUserA和AdminUserB),但他们只拥有与其所属特定客户端相关的记录的管理权限。

在这种情况下,您可以通过向用户AdminUserA提供具有值Admin的ClientA类型的声明,并为用户AdminUserB提供具有值Admin的ClientB类型的声明来实现此目的。然后在代码中,您只允许声明值为Admin的用户声明管理具有clientname的客户端的记录。

请参阅我对How to add claims in ASP.NET Identity的评论,了解向用户添加声明的两种不同方式(不幸的是,Microsoft似乎没有很好地记录这一点,因此不清楚是否需要这两种方法!) 。如上所述,您可以通过GenerateUserIdentityAsync(UserManager管理器)中的manager.AddClaim(userID,claim)向IdentityModel.cs中的类ApplicationUser(在MVC5项目中)添加对AspNetClaims表(但不是cookie)的声明。

您可以查看用户拥有的声明,如下所示: 当用户登录时,userIdentity.Claims应该包含用户拥有的所有声明(包括用户登录之前在AspNetClaims 中的自定义声明,但任何添加的声明因为via manager.AddClaim!)和manager.GetClaims(userID)应该返回所有用户的自定义声明(包括通过manager.AddClaim添加的声明!)。这很麻烦,微软真的应该整理一下,或者至少把它记录得更好!

希望这有帮助