【问题标题】:Authenticating ASP.NET Web API对 ASP.NET Web API 进行身份验证
【发布时间】:2013-11-16 14:43:37
【问题描述】:

我创建了一个新的 ASP.NET Web API,一切运行良好。我现在要保护 API。

我将 [Authorize] 属性放在我的基本控制器上方,如果我想在 ASP.NET 应用程序本身中进行 API 调用,它可以正常工作。

但是,我想知道,对于想要进行 API 调用并通过授权的外部客户端,最佳做法是什么?另外,请记住我有自定义身份验证逻辑。

客户端应该如何发送凭据?我在什么时候处理这​​些凭据?

【问题讨论】:

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


    【解决方案1】:

    基本上,您需要通过网络将加密的用户名和密码发送到您的服务器应用程序,然后您可以让您的 API 生成一个随机会话 ID 并将其保存在列表中(服务器端)并将 ID 发送回客户。现在,每次您的客户端向服务器发送一些东西时,将他收到的 ID 包含在数据包中,以便服务器每次都可以检查它。

    在客户端断开连接或固定超时时,您可以从服务器列表中删除 ID 并要求客户端重新进行身份验证。

    【讨论】:

    • 感谢您的帮助。如果客户端传回会话 ID,他们如何将其传回给我?所有这些信息是从哪里发送的? Http 标头?我在哪里编写代码来处理这个?有这方面的教程吗?
    • 这完全取决于您构建应用程序的方式以及您想要使用的协议。例如,如果您只有一个在套接字流中发送和接收字符串的 telnet 应用程序,您可以将 ID 作为字符串消息中的第一个参数。客户端只记住服务器接收到的 ID,并将其用作证明身份验证的票证,直到断开连接。
    • 它是一个 ASP.NET Web API,使用了 ASP.NET 的所有内置基础结构。仅通过 HTTP 接受请求。
    • 避免通过网络为 API 发送用户名和密码。共享密钥和签名将是首选。
    【解决方案2】:

    我应该如何发送客户端凭据?

    发送认证信息的默认位置是授权头。您可以将其用于基本身份验证,也可以用于其他类型的身份验证(JWT、Bearer 等)。

    Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
    

    例如,要向您的请求添加基本身份验证标头,您可以在客户端上使用以下代码:

    WebRequest request = (HttpWebRequest)WebRequest.Create("https://yoururl");
    request.Headers.Add(HttpRequestHeader.Authorization, "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("user:password")));
    

    我在什么时候处理这​​些凭据?

    我会写一个DelegatingHandler 并用它来解决你的“校长”问题。然后,您可以将其设置为 HttpContext.CurrentPrincipal,以便在请求范围内您需要它的任何地方都可以使用它。 DelegatingHandler 在您的控制器之前被调用,如下图所示,这使其成为身份验证逻辑的理想选择。

    我会在客户端上做同样的事情(写一个DelegatingHandlerActionFilterAttribute)以在默认位置添加身份验证标头。请注意,DelegatingHandlers 是 HTTP 管道的一部分,ActionFilterAttributes 属于 MVC 管道。

    最后但同样重要的是,我建议不要编写自己的自定义身份验证逻辑,而是坚持使用默认框架之一。这可以像通过 HTTPS 使用基本身份验证一样简单,也可以像实现 OAuth 一样复杂。但我会远离自己做的解决方案。

    我还想邀请你看看this answer我给了一个类似的问题。

    注意: ASP.NET Web Api 是基于 REST 的,所以恕我直言,您根本不想保留会话信息。

    编辑:有关如何实现处理基本身份验证的委托处理程序的示例,请参阅:basic http authentication in asp.net web api using message handlers.

    【讨论】:

    • 这很有帮助。还有一个问题。如果我想使用 OAuth 怎么办?我需要创建一个单独的 OAuth 服务来创建某种令牌,客户端在进行 API 调用之前会首先获得它,对吧?在某个地方有一个很好的例子吗?我似乎找不到任何简单的关于使用 Oauth 的 ASP.NET Web API 的安全性。
    • 如果您想设置一个单独的服务来创建令牌,请查看 ThinkTectures IdentityServer。在这种情况下,这真的可以帮助您:leastprivilege.com/2012/11/01/… 如果您想自己设置服务器或在您的服务中实现它,请查看DotNetOpenAuth。然后设置您自己的 IAuthorizationServerHost。一些例子看这里:github.com/ErikSchierboom/basicoauth2server.persistent。但请注意 OAuth 2.0 并不“简单”。
    猜你喜欢
    • 2017-07-04
    • 2013-11-14
    • 2018-03-19
    • 2015-01-12
    • 2012-06-16
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多