【问题标题】: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 并创建了 GenericPrincipalFormsIdentity 对象。在此代码中,您可以 构建自定义 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
    相关资源
    最近更新 更多