MVC5 中基于声明的身份验证



在我的应用程序中,有三种类型的用户。管理员、超级管理员、普通用户。我想在没有角色概念和使用声明的情况下进行身份验证。数据库中有一个名为 AspNetClaims 的表,用于 asp.net 身份。如何用索赔填充此表?首次注册用户时,应为其分配声明(管理员、超级管理员、用户)。然后接下来,当用户登录时,我必须能够找到用户的类型。我怎样才能实现它?

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

如果您只拥有给定类型的所有用户都可以具有相同权限的用户类型(而不是例如,不同数据记录的权限因用户而异),那么您实际上是在使用基于角色的权限而不是基于声明的权限一样。

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

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

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

您可以按如下方式检查用户的声明:当用户登录时,userIdentity.Claims 应包含用户拥有的所有声明(包括用户登录之前在 AspNetClaims 中的自定义声明,但不包括自通过管理器添加的任何声明)。添加声明!)和经理。GetClaims(userID) 应返回所有用户的自定义声明(包括通过管理器添加的声明)。添加声明! 这很混乱,Microsoft真的应该整理一下,或者至少更好地记录它!

希望这有帮助

步骤1:您必须将过滤器应用于操作方法,如以下示例所示

这是我的操作方法:

[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;
        }

相关内容

  • 没有找到相关文章