带有自定义身份验证的ASP.NET Web API

时间:2015-01-23 18:40:11

标签: c# asp.net asp.net-web-api

我正在寻找有关使用自定义用户名/密码身份验证创建Web API的帮助。

我有自己的数据库来验证用户,我不想使用Windows身份验证。

我希望能够使用[Authorize]这样的属性来装饰我的网络api调用,这样无需登录的调用就会失败。

我不想将凭证作为参数传递给每个方法。

此API主要由使用Xamarin PCL的移动设备使用。

Web API必须使用SSL。

这似乎是一个简单的设置,但我的谷歌搜索没有显示任何超级有用的命中。

理想情况下,我想要一个授权用户的Login控制器,并允许后续方法调用。

有人可以提供一个基本的例子或一些好的阅读材料吗?

3 个答案:

答案 0 :(得分:13)

这是一个很大的主题,你可能需要花一些时间来掌握基础知识,抱歉。

那说...... 为了对后续方法调用进行身份验证,您需要一些可以随每个请求传回的内容。如果你从网站上调用你的api,比如因为你使用的是Angular或类似的,那么一个简单的cookie(适当加密和MACed)就可以了。具体如何实现这取决于您是否使用OWIN以及您的项目中是否还有MVC来提供您的页面。不要自己创建cookie,使用FormsAuthentication或等效的OWIN中间件。 你不需要使用微软的会员资格或身份,但要注意做自己的密码处理并不简单,你真的需要知道你正在做什么 - 如果你想要的话,没有什么可以替代大量的研究要做到这一点。

如果你需要从网站以外的地方调用api,那么cookie就很痛苦。另外请注意,使用您需要了解和防范的cookie和Web API时,存在一些微妙的CSRF漏洞。

Cookie的替代方法是嵌入像ThinkTecture Identityserver(它是免费的)并使用它来发布oAuth令牌,然后将它们附加到每个API请求。它有许多优点,但也更复杂。

<强>资源
你确实要求指出从哪里开始阅读。由于Microsoft在过去几年中多次改变其“默认”方法,因此您的任务变得复杂。当前的默认方法是Identity,它取代了之前的MembershipProvider(很好的解决方案)。如果你是这个新手,我建议你走这条路线说实话 - 你可以扩展它,并且非常好地与大部分剩余的堆栈联系起来。是的,您失去了一些灵活性,您需要将其包装在当前的用户商店中。但是你需要问问自己,你开箱即用的安全性是不值得的。

我还建议Brock Allen's blog。这是相当硬的,但他知道他的东西,并将经常解释许多微软认证技术的内部。

我建议您尝试阅读“OWIN身份验证中间件”。这就是它的全部,尤其是ASP.Net vNext。可悲的是,大多数文档都集中在如何使用它(它是 - 用于演示),但缺乏关于它如何真正有效的深入信息,这可能非常令人沮丧。

为了掌握令牌和不同标准的工作原理,我建议您在此处观看此视频:http://www.ndcvideos.com/#/app/video/2651

然后看看Azure移动服务,它甚至还有用于处理我认为的auth或ThinkTecture Identity Server的客户端库。即使你最终使用IdSrv ,通过他们关于如何使用它的教程,你将学到很多关于整个事情如何工作的非常多的东西;这一切都基于开放标准。文档:http://identityserver.github.io/Documentation/docs/ 尝试完成他们的教程;他们使用Windows控制台应用程序代替应用程序,但概念是相同的。

祝你好运,但我想结束时说不要只是在一起破解似乎有用的东西。 Web安全性越来越复杂,很容易在代码中留下漏洞 - 我从经验谈起:)

不要成为Moonpig。

答案 1 :(得分:4)

取决于您使用的版本。 MVC5 Web API 2实现了一种称为承载令牌的方法。因此,您基本上可以在https://applicationhostlocation/token端点前面使用用户名和密码执行帖子。这将在有效负载中返回承载令牌。您可以使用标头中的承载令牌向您的授权Web api方法发送后续https请求。这是开箱即用的最新版本的web api。此链接很好地概述了该方法:http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api

答案 2 :(得分:2)

自定义会员提供商我的朋友!

https://codeutil.wordpress.com/2013/05/14/forms-authentication-in-asp-net-mvc-4/

使用自定义成员资格提供程序您可以设置授权Cookie令牌(也称为AuthCookie),并在应用程序中使用表单身份验证技术。使用自定义成员资格提供程序,您将能够创建一个自定义验证方法来访问您的数据库以匹配用户凭据。

使用AuthCookie,每个后续请求都将进行身份验证,就像传统的授权Cookie技术一样。

此外,您可以使用重写Url方法强制用户重定向到SSL页面:Best way in asp.net to force https for an entire site?