2009-12-01 119 views
5

我想使用AuthorizeAttribute控制哪些用户可以访问我的操作。我只是想澄清一下,我的逻辑是正确的。ASP.Net MVC成员资格

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

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

回答

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?

和propably在许多其他StackOverflow的问题:)

编辑

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

你应该阅读此页:

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

特别是:

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

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

+0

我已经阅读了很多问题和外部博客,但没有人真的把这整个部分放到上下文中。你可以解释一下MyBusinessLayerSecurityClass.CreatePrincipal(id,id.Name)部分的 – scottm 2009-12-01 23:56:13

+0

。如果HttpContext.Current.User属性为null,我不明白如何获取FormsIdentity。 – scottm 2009-12-02 02:12:26

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以确定用户是否有权访问该操作。
+1

+1:这也是我所做的。我的文章解释了如何检查cookie。 – LukLed 2009-12-02 00:14:10

+0

优秀,感谢您的参与 – scottm 2009-12-02 01:56:27