【问题标题】:ASP.Net MVC MembershipsASP.Net MVC 成员资格
【发布时间】:2009-12-01 21:37:01
【问题描述】:

我想使用 AuthorizeAttribute 来控制允许哪些用户访问我的操作。我只是想澄清一下我的逻辑是有序的。

  1. 我创建了自己的 IPrincipal 实现
  2. 我将用户凭据发布到安全控制器的登录操作。
  3. 我使用 UserService 类验证凭据,并将从我的 UserService 类返回的 IPrincipal 分配给 HttpContext.User
  4. 继承 AuthorizeAttribute 的我的 WebAuthorizeAttribute 检查当前的 HttpContext.User.Identity.IsAuthenticated 和 HttpContext.User.IsInRole 以确定用户是否有权访问该操作。

是正常的事情吗?我知道我可以继承 MembershipProvider,但我不需要那里的所有功能,实际上只需要使用两个不同角色登录的能力。

【问题讨论】:

    标签: asp.net-mvc membership


    【解决方案1】:

    您必须将 IPrincipal 存储在某处,并在每次请求时恢复它。如果您将使用 FormsAuthentication,这是一个很好的解决方案:

    ASP.NET 2.0 Forms authentication - Keeping it customized yet simple

    您可以在此处找到其他解决方案:

    Where to store logged user information on ASP.NET MVC using Forms Authentication?

    并且可以在许多其他 StackOverflow 问题中使用:)

    编辑

    关于 MyBusinessLayerSecurityClass.CreatePrincipal(id, id.Name):

    你应该阅读这个页面:

    http://msdn.microsoft.com/en-us/library/aa480476.aspx

    特别是这个:

    FormsAuthenticationModule 类构造一个 通用主体 对象并将其存储在 HTTP 语境。这 通用主体 对象持有对 a 的引用 FormsIdentity 代表当前的实例 经过身份验证的用户。你应该允许 形成身份验证来管理这些 给你的任务。如果您的应用程序 有特定的要求,例如 设置用户 属性到一个自定义类 实现 IPrincipal 接口, 您的应用程序应该处理 身份验证后 事件。这 身份验证后 事件发生后 FormsAuthenticationModule 已验证表单身份验证 cookie 并创建了 GenericPrincipal 和 FormsIdentity 对象。在此代码中,您可以 构建自定义 IPrincipal 对象 包裹着 FormsIdentity 对象, 然后将其存储在 HttpContext. 用户 属性。

    FormsIdentity 会在您设置身份验证 cookie 后自动进行管理。您所要做的就是将它包装在您的 IPrincipal 中。当 HttpContext.Current.User 属性 不为空 (它是 GenericPrincipal,您稍后将替换它)时,所有这些都会发生。当 HttpContext.Current.User 为 null 时,表示之前没有创建身份验证 cookie,并且用户未经过身份验证。

    【讨论】:

    • 我已经阅读了很多问题和外部博客,但似乎没有人真正将整个部分置于上下文中。
    • 您能否解释一下 MyBusinessLayerSecurityClass.CreatePrincipal(id, id.Name) 部分。如果 HttpContext.Current.User 属性为空,我不明白您如何获得 FormsIdentity。
    【解决方案2】:

    我认为以下比较典型:

    1. 我创建了自己的 IPrincipal 实现
    2. 我将用户凭据发布到安全控制器的登录操作。
    3. 我使用 UserService 类验证凭据并构造一个包含该用户的一些识别信息的 cookie。通常使用 FormsAuthentication.SetAuthCookie 或该类的实用方法的某种组合。
    4. 在 Application AuthenticateRequest 事件中,检查 cookie 并分配 Context.User。 注意:此值在 AuthenticateRequest 事件之后自动分配给 Thread.CurrentPrincipal。这是一次性分配,此后这些值不会自动同步。
    5. 继承 AuthorizeAttribute 的我的 WebAuthorizeAttribute 检查当前的 HttpContext.User.Identity.IsAuthenticated 和 HttpContext.User.IsInRole 以确定用户是否有权访问该操作。

    【讨论】:

    • +1:我也是这样做的。我的帖子解释了如何检查 cookie。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多