【问题标题】:ASP.NET Web API with custom authentication具有自定义身份验证的 ASP.NET Web API
【发布时间】:2015-03-22 21:14:49
【问题描述】:

我正在寻求帮助,以创建具有自定义用户名/密码身份验证的 Web API。

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

我希望能够使用[Authorize] 之类的属性来装饰我的 web api 调用,以便在未登录的情况下进行的调用将失败。

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

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

Web API 必须使用 SSL。

这似乎是一个简单的设置,但我的谷歌搜索并没有发现任何超级有用的点击。

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

谁能提供一个基本的例子或一些好的阅读材料?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 哦,太好了,我不知道他们已经把它烤进去了。
    • 这篇文章很臭。它几乎完全专注于客户端,使用内置的会员数据库,甚至不构建示例应用程序。The Log In button sends a request to the token endpoint. 令牌端点在哪里?
    【解决方案2】:

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

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

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

    使用 AuthCookie,每个后续请求都将被验证,就像传统的 Authorization Cookie 技术一样。

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

    【讨论】:

    • 您绝对可以使用它,但现在 MembershipProvider 已被 Identity 取代。另外 - MembershipProvider 是一个有漏洞的抽象,在 MVC/Web API 中几乎没有用处。我在这里写了一篇关于这个的帖子:blog.lytzen.name/2013/03/using-aspnet-mvc-without.html Brock Allens 在这里:brockallen.com/2012/09/02/…
    • 那里有太多零散的信息,这无济于事。我发现的所有身份示例都没有使用自定义数据库进行自定义身份验证
    • @Julien:是的,确实 - 过于关注简单的演示 :(
    • @Julien 我更新了我的答案,为您提供了一个完整的示例,该示例实现了具有许多扩展功能的自定义会员提供程序。它涵盖了从使用您自己的数据库对用户进行身份验证到高级角色授权
    • @Frans 我同意这个新的身份框架很迷人。但非常重要的是要注意,虽然默认的 SimpleCustomMembershipProvider 非常有限,但设计良好的 CustomMembershipProvider 可以非常强大。
    【解决方案3】:

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

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

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

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

    资源
    您确实要求提供有关从何处开始阅读的指示。由于 Microsoft 在过去几年中多次更改其“默认”方法,因此您的任务变得复杂。当前的默认方法是Identity,它取代了以前的 MembershipProvider(很好摆脱)。如果你是新手,老实说,我建议你走那条路——你可以扩展它,它与堆栈的大部分其余部分很好地联系在一起。是的,你失去了一些灵活性,你需要将它包装在你当前的用户存储中。但是您需要问问自己,开箱即用的安全性是否不值得。

    我也会推荐Brock Allen's blog。这很硬核,但他知道自己的东西,并且经常会解释许多 Microsoft 身份验证技术的内部结构。

    我建议您尝试阅读“OWIN 身份验证中间件”。这就是一切,尤其是 ASP.Net vNext。可悲的是,那里的大多数文档都集中在它的超级易用性上(而且它是 - 用于演示),但缺乏关于它如何真正工作的任何深入信息,这可能非常令人沮丧。

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

    然后看看 Azure 移动服务,它甚至有客户端库来处理我相信的身份验证或 ThinkTecture Identity Server。即使你最终使用 IdSrv,通过阅读他们关于如何使用它的教程,你也会学到很多关于整个事情如何运作的知识;这一切都基于开放标准。此处的文档:http://identityserver.github.io/Documentation/docs/ 尝试完成他们的教程;他们使用 Windows 控制台应用程序代替应用程序,但概念是相同的。

    祝你好运,但我想在结束时说不要只是把看似可行的东西拼凑在一起。 Web 安全越来越复杂,很容易在代码中留下漏洞——我是根据经验来谈的:)

    不要做月猪。

    【讨论】:

    • 这是供移动设备使用的。
    • 如果移动设备是指移动设备上的应用程序,而不仅仅是移动浏览器上的网站,那么您需要像 oAuth 令牌或 @Noel 提到的不记名令牌之类的东西......看看 IdentityServer。或者,如果您在 Azure 上托管,他们会在移动服务中加入身份验证 - 但我从未使用过它,因此不确定它是否能满足您的要求。或者考虑让用户只使用 Google/Facebook/Twitter 登录。
    • 社交网络登录不是一个选项。这是针对移动应用的,是的
    • 然后看看 Azure 移动服务或 ThinkTecture Identity Server。即使你最终使用 IdSrv,通过阅读他们关于如何使用它的教程,你也会学到很多关于整个事情如何运作的知识;这一切都基于开放标准。文档在这里:identityserver.github.io/Documentation/docs OpenIDConnect 的精彩概述视频在这里:ndcvideos.com/#/app/video/2651
    • 我正在用 Xamarin PCL 编写移动应用程序。不要认为 azure 移动服务适用。 identifyServer 似乎是要走的路
    猜你喜欢
    • 2016-05-06
    • 2018-03-15
    • 2014-05-21
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多