20

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

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

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

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

4

2 回答 2

21

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

发送身份验证信息的默认位置是授权标头。您可以将其用于基本身份验证,也可以用于其他类型的身份验证(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如下图所示,它在您的控制器之前被调用,这使其成为身份验证逻辑的理想选择。

在此处输入图像描述

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

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

我还想邀请您看一下我对类似问题的回答

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

编辑:有关如何实现处理基本身份验证的委托处理程序的示例,请参阅:使用消息处理程序的 asp.net Web api 中的基本 http 身份验证。

于 2013-11-05T16:56:28.193 回答
3

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

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

于 2013-11-05T16:31:05.920 回答