【问题标题】:Asp.net membership custom authentication add user details to userdata with rolesAsp.net 成员身份自定义身份验证将用户详细信息添加到具有角色的 userdata
【发布时间】:2014-10-25 22:16:17
【问题描述】:

我已按照以下指南Forms-Authentication-and-Role-based-Authorization 成功实现自定义会员身份验证和授权。我正在使用会话来获取其他用户详细信息,例如名字和姓氏。但是,当 auth cookie 仍然存在/有效时,会话可能会丢失。现在我希望能够将用户详细信息添加到 cookie,但不知道该怎么做。正在考虑将其添加到角色字符串并从那里获取它,但不确定有什么含义。我也看过这个链接Store data in auth cookie,但它没有提到使用角色。

因此,我如何将角色和其他用户详细信息作为 cookie 的一部分获取,这样我就不必访问数据库来获取这些详细信息?

谢谢。

【问题讨论】:

    标签: c# asp.net authentication cookies


    【解决方案1】:

    我会创建一个custom RoleProvider,而不是您链接的方法。

    至于用户详细信息,我会将其与身份验证/授权逻辑分开。正如 Zhaph - Ben Duguid 建议的那样,使用 Profile Provider,或者自己实现它。

    如果你使用 Session 来缓存用户详细信息,那么 Session 与身份验证 cookie 无关这一事实是没有问题的,因为如果 Session 丢失,你总是可以从数据库中刷新。

    类似:

    public UserDetails UserDetails
    {
        get
        {
            UserDetails userDetails = Session["UserDetails"] as UserDetails;
            if (userDetails == null)
            {
                userDetails = GetUserDetailsFromDatabase(HttpContext.Current.User.Identity.Name);
                Session["UserDetails"] = userDetails;
            }
            return userDetails;
        }
    }
    

    【讨论】:

    • 我知道我总是可以从数据库刷新会话,但我已经提到不想再次访问数据库,只要身份验证 cookie 存在/有效。谢谢。
    • @zulq - “只要 auth cookie 存在/有效,就不想再次访问数据库” - 为什么不呢?如果将结果缓存在 Session 中,访问将不频繁。恕我直言,保持身份验证、授权和配置文件信息相互独立可以减少耦合,这是一件好事。例如。如果您切换到 Windows 身份验证,您的授权和配置文件功能不会中断,因为不再有身份验证 cookie。
    【解决方案2】:

    如果您要使用 Membership 提供程序创建持久用户,最好将其他用户详细信息存储在独立于用户浏览器的类似持久存储中。

    您是否查看过Profile provider,它允许您将个人资料信息与您的会员数据一起存储?这可以与 Membership 和 Roles 提供程序一起工作,甚至允许您为匿名用户创建一个持久的配置文件,您可以在他们注册后继续使用。

    如果您确定不想使用配置文件提供程序(并且有理由不这样做),那么请务必查看DanH's answer 关于使用 AuthToken 的 UserData 字段 - 但请注意您将需要自己生成(或重新生成)身份验证令牌 - 我不应该担心这个更不用说角色,它应该可以很好地与现有方法一起工作。

    【讨论】:

    • 我不确定您是否查看了链接上的第一篇文章。他实际上是在使用 UserData 作为角色。
    • 不确定您指的是哪个链接,DanH 的 answer 上的链接明确谈到在 UserData 字段中存储名字?
    • 我的意思是帖子上的第一个链接。我知道 Dan​​H 的答案是使用 UserData,但第一个链接上的授权也是使用 UserData 作为角色。
    • 我强烈建议不要将角色详细信息存储在 UserData 字段中 - 这不是您想要发送到可能被篡改的客户端的内容(如果我破坏了您的加密程序并制作我自己是管理员,你怎么知道?)。将角色成员资格数据保存在您可以控制的服务器/数据库端 - 如果您真的想减少数据库旅行,您可以考虑将其添加到用户会话中(因为只有 SessionId 在 cookie 中)...
    猜你喜欢
    • 1970-01-01
    • 2012-04-10
    • 2010-10-29
    • 2011-05-23
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多