ASP.Net MVC会员资格

sco*_*ttm 5 membership asp.net-mvc

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

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

事物的正常流动是什么?我知道我可以继承MembershipProvider,但我不需要那里的所有功能,实际上只能用两个不同的角色登录.

Luk*_*Led 4

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

ASP.NET 2.0 Forms 身份验证 - 保持自定义但简单

您可以在这里找到其他解决方案:

使用表单身份验证在 ASP.NET MVC 上的何处存储已记录的用户信息?

可能在许多其他 StackOverflow 问题中:)

编辑

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

您应该阅读此页面:

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

特别是这个:

FormsAuthenticationModule 类构造一个 GenericPrincipal对象 并将其存储在 HTTP 上下文中。GenericPrincipal对象 保存对 表示当前经过身份验证的用户的FormsIdentity实例的引用。您应该允许表单身份验证来为您管理这些任务。如果您的应用程序有特定要求,例如将User属性设置为实现IPrincipal接口 的自定义类 ,则您的应用程序应处理 PostAuthenticate 事件。PostAuthenticate 事件在FormsAuthenticationModule 验证表单身份验证 cookie 并创建 GenericPrincipalFormsIdentity 对象 后发生 。在此代码中,您可以构造一个 包装 FormsIdentity对象的自定义IPrincipal对象,然后将其存储在 HttpContext 中。用户财产。

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