ASP.Net MVC会员资格

5

我想使用AuthorizeAttribute来控制哪些用户可以访问我的操作。我只是想澄清一下我的逻辑是否正确。

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

这是正常的流程吗?我知道我可以继承MembershipProvider,但我不需要那里面的所有功能,只需要能够使用两个不同角色进行登录的功能。

2个回答

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

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


我阅读了很多问题和外部博客,但似乎没有一个可以将整个部分放入背景中的。 - scottm
你能解释一下MyBusinessLayerSecurityClass.CreatePrincipal(id, id.Name)这部分的含义吗?如果HttpContext.Current.User属性为空,我不明白如何获得FormsIdentity。 - scottm

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接