ASP.Net MVC会员资格

时间:2009-12-01 21:37:01

标签: asp.net-mvc membership

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

  1. 我创建了自己的IPrincipal实现
  2. 我将用户的凭据发布到安全控制器的登录操作。
  3. 我使用UserService类验证凭据,并将从UserService类返回的IPrincipal分配给HttpContext.User
  4. 我的WebAuthorizeAttribute继承AuthorizeAttribute,检查当前的HttpContext.User.Identity.IsAuthenticated和HttpContext.User.IsInRole以确定用户是否有权访问该操作。
  5. 物质的正常流动是什么?我知道我可以继承MembershipProvider,但我不需要那里的所有功能,实际上只能用两个不同的角色登录。

2 个答案:

答案 0 :(得分:4)

你必须将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   class构造一个   的的GenericPrincipal   对象并将其存储在HTTP中   上下文。该   的的GenericPrincipal   对象持有对a的引用   的 FormsIdentity   表示当前的实例   认证用户。你应该允许   表单身份验证来管理这些   为你完成的任务。如果您的申请   有具体要求,如   设置用户   属性到自定义类   实现    IPrincipal 界面,   你的申请应该处理   的 PostAuthenticate   事件。该   的 PostAuthenticate   事件发生在   的 FormsAuthenticationModule   已验证表单身份验证   cookie并创建了    GenericPrincipal 和   的 FormsIdentity   对象。在此代码中,您可以   构建一个自定义    IPrincipal 对象   包裹着    FormsIdentity 对象,   然后将其存储在    HttpContext。用户   属性。

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

答案 1 :(得分:2)

我认为以下更为典型:

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