角色提供者/会员?如何在asp.net web api中?

时间:2013-05-21 20:48:45

标签: asp.net-web-api asp.net-membership simplemembership

我正在构建一个asp.net mvc web api应用程序,但不确定如何进行会员资格。

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

我自己的Users TableRole Table我没有使用asp.net会员资格,因为它带来了太多的包袱,并且不符合我想要设计我的数据库的方式(我确实可以,但它只是似乎很多工作)

user可以有多个角色,而role可以有多个用户

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

在过去的项目中,我自己创建了Authorize Attribute我自己调用数据库的内容,并检查用户是否在该控制器/操作方法上允许的角色正确。

由于没有做任何会员提供者,我失去了一些内置功能,例如User.IsInRole。我仍然可以使用User.Identity.Name,但我认为这是因为我设置的cookie。

现在在asp.net mvc 4 / web api中执行此操作的最佳方法是什么?

谷歌搜索时我找到了“SimpleMembership”,但还没有读过很多内容。

如果我对用户进行身份验证,可以在我的webapi上使用User.Identity.Name吗?

2 个答案:

答案 0 :(得分:4)

这是article that describes how to create a custom authorize attribute for Web API's using SimpleMembership。您不必使用SimpleMembership,虽然它非常灵活且易于使用。您可以在本文中采用相同的概念,并使用您的会员服务,只要您的服务可以验证特定用户是否在角色中,登录和注销用户,并验证他们是否经过身份验证。

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

此自定义授权属性支持表单身份验证和基本身份验证,以防您将API公开给公众。它与控制器上使用的授权属性的不同之处在于,如果未经授权,则返回HTTP状态代码Forbidden;如果未经过身份验证,则返回Unauthorized;而不是重定向到登录页面。

答案 1 :(得分:0)

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

如果您不想使用任何这些内置功能,那么请不要使用它们而不是写User.IsInRoleMyService.IsInRole。无论您是想推送自定义提供程序还是使用内置函数,还是只编写一个能够为您处理的服务层,这都是个人偏好的问题。我认为选择将取决于您应该考虑的许多因素以及与项目细节相关的因素。例如,如果将来您打算让其他外部开发人员参与此项目,那么选择自定义成员资格和角色提供程序会更明智,因为这些开发人员可能更熟悉此API而不必学习您的自定义服务层。