【问题标题】:Another ASP.NET custom membership/role provider另一个 ASP.NET 自定义成员/角色提供程序
【发布时间】:2013-12-10 17:27:59
【问题描述】:

ASP.NET 4.5 / C# / SQL 2012

我已经有一个定义明确的数据库,其中包含一个用户表和一个角色/权限列。该列包含一个分隔的角色列表。我希望在后端使用 ASP.NET 的内置功能,这样我就可以偷懒并使用 and filter by role 之类的东西。我想从数据库中读取我的角色并告诉 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"));

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

谢谢大家。

【问题讨论】:

    标签: asp.net asp.net-membership


    【解决方案1】:

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

    其他情况,只需要选择持久化机制,对应的认证模块根据持久化设置身份/主体即可。

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

    如果您想用您的自定义 cookie 替换 cookie(换句话说 - 用您自己的替换表单身份验证) - 您必须想办法将安全信息保存到 cookie 中。

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

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

     Roles.AddUsersToRoles( ... );
    

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

     Membership.CreateUser( ... );
    

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

    【讨论】:

    • 我不太明白。我正在尝试利用诸如 LoginView 和 web.config 读取角色的权限之类的东西。我想从代码隐藏中为当前用户添加一个角色。
    • 这就是 RoleProvider 用于读取和存储角色到数据库的内容。对于登录用户,必须使用表单 cookie。
    • 编辑了我的答案。仍然不确定您缺少哪一部分。
    • 是的,我可能需要重新考虑这一点,但我会再推进一次,哈哈。那么,当使用默认的 ASP.NET 角色和成员资格时,我们是否说每次 ASP 需要检查用户的角色(登录视图、web.config 中的子文件夹权限)时,它会进入数据库?它不是在登录时将这些信息永久存储在某个地方并在之后引用它吗?
    • 我问是因为我试图模拟那部分。我有一个数据库,其中包含我不想修改的角色,并且我喜欢使用依赖于 loginview 和子文件夹限制等角色的内置功能。我只想从我的数据库中提取角色,然后告诉 ASP...嘿,这是当前用户在没有疯狂管道的情况下所处的角色。白日梦?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 2011-06-04
    • 1970-01-01
    相关资源
    最近更新 更多