【问题标题】:can I make use of user.IsInRole without using Membership?我可以在不使用 Membership 的情况下使用 user.IsInRole 吗?
【发布时间】:2010-02-18 06:30:44
【问题描述】:

我正在使用表单身份验证,我想使用角色,我可以以某种方式设置没有成员身份的用户角色吗?

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

    一种简单的方法是在用户通过身份验证时将角色列表存储在身份验证票证中。然后为每个请求(global.asax 文件的Application_AuthenticateRequest 方法)提取角色,将它们添加到GenericPrincipal 对象并设置Httpcontext.User 属性。

    您的User.IsInRole("role")[AuthorizeAttribute(Roles="role")] 将正常工作。

    请参阅this answer 以获取详细说明如何操作的代码。

    【讨论】:

      【解决方案2】:

      您的意思是“不使用 ASP.NET 的标准 Membership 实现”吗?

      如果是这样,那么可以,您可以通过实施自己的成员资格和/或角色提供程序来实现。请参阅 herehere 了解有关如何实现成员资格/角色提供程序的详细信息。

      【讨论】:

      • 其实我也想在不实现asp.net Membership的情况下做到这一点,我只需要一件简单的事情:设置用户的角色,但是Membership有很多东西
      • @Omu:IIRC 你只需要实现你实际使用的方法。只需将其他方法留空即可。
      【解决方案3】:

      是的,你可以。

      唯一需要注意的是,角色不适用于匿名用户(我认为这很明显),您需要一些机制来设置用户的身份(可以是您喜欢的任何身份)。

      MSDN 文章:

      Understanding Role Management

      包含以下信息:

      但是,角色管理不 取决于会员。只要你 在您的应用程序中设置方法 用户身份,可以使用角色 授权管理。

      【讨论】:

      • 所以在使用 Roles.AddUserToRole("username", "rolename") 之后,我需要实现 RoleProvider 并在 web.config 中设置我的自定义角色提供程序,对吗?
      • @Omu - 是的,这就是你必须做的。但请记住,您需要在页面请求之间(根据 çağdaş 的答案中的 cmets/conversation)和应用程序的生命周期保持角色和用户对象。如果您的用户对象是纯粹在代码中创建的,则尤其如此。如果您使用的是自定义角色提供程序(而不是例如“内置”SQL),那么最好也实现您自己的自定义成员资格提供程序。有关示例,请参阅:devx.com/asp/Article/29256
      【解决方案4】:

      您不需要实现整个会员提供程序。

      创建您自己的Principal(具有IsInRole 方法)和Identity
      然后确保您的用户对象 (HttpApplication.Context.User) 在每个请求中都填充了您的主体。
      完毕。现在Authorize 属性将与您的委托人对话。

      【讨论】:

      • 但我需要将登录用户存储在会话中的某个位置,并在每个请求中设置它(执行操作)
      • @Omu,是的,当然。您将不得不以某种方式保留这些信息。
      • @Omu 我猜。我建议采用这种方式,因为它应该与内置的 Authorize 属性很好地配合使用。但是,当然,如果要确保它与您的应用程序的其余部分一起工作太麻烦,那么显然这不是最好的解决方案。
      • @Omu 您可以将角色和用户 ID 存储在身份验证 cookie 中。很简单,看我的回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 2012-03-28
      相关资源
      最近更新 更多