Asp.net web api 角色提供者/成员?如何在asp.net web api中使用?

Asp.net web api 角色提供者/成员?如何在asp.net web api中使用?,asp.net-web-api,asp.net-membership,simplemembership,Asp.net Web Api,Asp.net Membership,Simplemembership,我正在构建一个asp.net mvc web api应用程序,但不确定如何处理成员资格问题 在我当前的项目中,我有这个 我自己的用户表和角色表我没有使用asp.net成员资格,因为它带来了太多的负担,不适合我想要设计数据库的方式(当然可以,但似乎需要做很多工作) 用户可以拥有多个角色,角色可以拥有多个用户 我使用EF来完成几乎所有对数据库的调用 在过去的项目中,我创建了我自己的Authorize属性我自己对我的数据库调用了什么,并检查用户是否处于该控制器/操作方法所允许的正确角色 由于没有使用任

我正在构建一个asp.net mvc web api应用程序,但不确定如何处理成员资格问题

在我当前的项目中,我有这个

我自己的
用户表
角色表
我没有使用asp.net成员资格,因为它带来了太多的负担,不适合我想要设计数据库的方式(当然可以,但似乎需要做很多工作)

用户
可以拥有多个角色
角色
可以拥有多个用户

我使用EF来完成几乎所有对数据库的调用

在过去的项目中,我创建了我自己的
Authorize属性
我自己对我的数据库调用了什么,并检查用户是否处于该控制器/操作方法所允许的正确角色

由于没有使用任何成员资格提供程序,我失去了一些内置函数,例如
User.IsInRole
。我仍然能够使用
User.Identity.Name
,但我认为这是因为我设置了cookie

现在在asp.net mvc 4/web api中实现这一点的最佳实践方法是什么

在谷歌搜索时,我发现了“SimpleMembership”,但还没有读到太多


另一方面,如果我对用户进行了身份验证,我可以在webapi中使用
User.Identity.Name

您仍然可以编写自定义成员资格提供程序,并仅实现您想要使用的方法。就
User.IsInRole
而言,您可以通过从类继承并在web.config中注册来编写自定义角色提供程序

如果您不想使用任何内置功能,那么就不要使用它们,而是编写
User.IsInRole
write
MyService.IsInRole
。无论您是想要滚动您的自定义提供者并使用内置函数,还是仅仅编写一个服务层来为您处理这些,这实际上是个人偏好的问题。我认为选择将取决于你应该考虑的许多因素,这些因素与你的项目的具体情况有关。例如,如果将来您打算让其他外部开发人员参与此项目,则选择自定义成员资格和角色提供程序会更明智,因为这些开发人员可能更熟悉此API,而不必学习您的自定义服务层。

以下是一个示例。您不必使用SimpleMembership,尽管它非常灵活且易于使用。您可以采用本文中的相同概念,改用您的会员服务,只要您的服务能够验证特定用户是否在某个角色中,登录和注销用户,以及验证他们是否经过身份验证

如果您的服务未验证它们是否经过身份验证,则可以使用User.Identity.IsAuthenticated并使用User.Identity.Name获取当前登录的usersname;假设您的服务在用户登录时正确设置了Thread.CurrentPrincipal。建议您设置HttpContext.Current.User。当然,如果使用SimpleMembership,您不必担心这些


此自定义授权属性支持表单身份验证和基本身份验证,以防您向公众公开API。它不同于控制器上使用的authorize属性,因为如果未授权,则返回禁止的HTTP状态码;如果未验证,则返回未授权的HTTP状态码;而不是重定向到登录页。

User.Identity.Name如何在asp.net webapi中设置?在以前的mvc 3应用程序中,我的自定义授权属性中有一个:httpContext.User.Identity.Name,然后我用这个名称使用自己的服务层来找出该用户拥有哪些权限。我可以使用我认为由cookie设置的httpContext.User.Identity.Name吗?是的,您可以使用自定义的authorize属性并将
Thread.CurrentPrincipal
设置为相应的用户。看一看我编写的一个示例实现,它使用带有基本身份验证的成员资格提供程序:在这个示例中,我使用了一个自定义的委托处理程序,但如果您愿意,也可以使用授权过滤器。这非常有帮助。不过我有几个问题。为什么是异步的?为什么必须注册处理程序(我没有注册,User.Identity已填充,但我没有设置为异步),为什么要填充角色,因为不知道如何访问它们。