另一个ASP.NET自定义成员/角色提供者

时间:2013-12-10 17:27:59

标签: asp.net asp.net-membership

ASP.NET 4.5 / C#/ SQL 2012

我已经有一个定义良好的数据库,其中包含一个users表和一个角色/权限列。该列包含一个分隔的角色列表。我希望在后端使用ASP.NET的内置功能,所以我可以懒惰并使用像角色过滤器这样的东西。我想从数据库中读取我的角色并告诉ASP这些是我的用户所处的角色。自定义...但希望很简单。以下是我到目前为止的情况:

        //create an identity
        GenericIdentity objIdentity = new GenericIdentity("Matt"); //this would actually be the username/email of the newly authenticated user

        //get roles for user
        string[] strRoles = { "ADW", "USR" }; //this will get read from the database on authentication

        //add identity and roles to a principal
        GenericPrincipal objPrincipal = new GenericPrincipal(objIdentity, strRoles);           

        //add to current user
        HttpContext.Current.User = objPrincipal;

        //add the principal to the current context of the current thread
        Thread.CurrentPrincipal = objPrincipal; //not sure what this does, doesn't affect my results/tests

如果我执行上面的代码然后运行以下代码:

Response.Write(User.IsInRole("ADW"));
Response.Write(User.IsInRole("xxx"));

我按预期得到了一个真/假。但是,这不会持续到下一页。我对自定义成员资格/角色提供程序进行了大量阅读,但我找不到这个特定的用例。大多数人都在谈论专门为此任务设置数据库。我也看到了较新的简单会员资格,但也无法从中获得任何爱。我希望有一个解决方案涉及我已经在做的事情。我很乐意在用户进行身份验证时执行此代码,但能够在其他页面中引用此用户。我总是可以为每个页面调用数据库。我认为那会很糟糕,而这不是内置提供商所做的。

谢谢大家。

1 个答案:

答案 0 :(得分:0)

你正从错误的方面接近它。假设您没有创建自定义身份验证模块,则不必手动创建身份和主体。

在任何其他情况下,您只选择持久性机制,相应的身份验证模块根据持久性设置身份/主体。

常用的持久性机制是表单身份验证,您可以在其中发出表单cookie。表单身份验证模块确保在管道的早期设置身份/主体,并将cookie作为信息源。

如果你想用自定义cookie替换cookie(换句话说 - 用自己的cookie替换表单身份验证) - 你必须考虑一种方法来保存安全信息,例如cookie。

但请注意,这可能不是必需的。任何自定义成员身份和角色提供程序都可以使用相同的表单身份验证。这是因为这两者有不同的职责 - memberip提供者用于实际身份验证,而表单身份验证模块用于持久保存连续请求的信息。

编辑:为用户添加角色,使其保留在用户数据库中:

 Roles.AddUsersToRoles( ... );

但首先,您必须在用户数据库中创建用户:

 Membership.CreateUser( ... );

请注意,RolesMembership是实际角色和成员资格提供者的外观。虽然默认提供程序使用成员资格数据库,但您可以轻松创建自定义提供程序,以便在服务器端的任何位置保留信息。