2013-05-21 101 views
8

我正在构建一个asp.net mvc web api应用程序,并不确定如何执行会员资格。角色提供者/会员资格?如何在asp.net 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”,但还没有读取太多。

在旁注中,如果我对用户进行了身份验证,是否可以使用User.Identity.Name与我的webapi?

回答

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状态代码,如果未授权,则返回未授权状态;而不是重定向到登录页面。

0

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

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

+0

User.Identity.Name如何在asp.net webapi中设置?在以前的mvc 3应用程序中,我在自定义授权属性中使用了:httpContext.User.Identity.Name,然后使用我自己的服务层和该名称来查找用户具有的权限。我可以使用httpContext.User.Identity.Name,因为我认为这是由Cookie设置的吗? – chobo2

+0

是的,您可以拥有自定义授权属性,并将'Thread.CurrentPrincipal'设置为相应的用户。看看我使用Basic身份验证使用成员资格提供程序编写的示例实现:http://stackoverflow.com/a/11536349/29407在此示例中,我使用了自定义委派处理程序,但是如果您使用授权过滤器也想要。 –

+0

很酷,这是非常有帮助的。但有几个问题。为什么是异步?为什么你必须注册处理程序(我没有和User.Identity被填充,但我没有做异步),为什么填充角色在不知道如何访问它们。 – chobo2

相关问题