我已经创建了一个新的ASP.NET Web API,但事情进展顺利。我现在正处于确保API安全的地步。
如果我想在ASP.NET应用程序本身内进行API调用,我将[Authorize]属性放在我的基本控制器上面并且它正常工作。
但是,我想知道,对于想要进行API调用并通过授权的外部客户端,最佳做法是什么?另外,请记住我有自定义身份验证逻辑。
客户端应如何发送凭据?我在什么时候处理这些凭证?
答案 0 :(得分:20)
我应该如何发送客户端凭据?
发送身份验证信息的默认位置是授权标头。您可以将其用于基本身份验证,也可以用于其他类型的身份验证(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
,如下图所示,这使其成为身份验证逻辑的理想选择。
我会在客户端上执行相同操作(编写DelegatingHandler
或ActionFilterAttribute
)以在默认位置添加身份验证标头。请注意,DelegatingHandler
是HTTP管道的一部分,ActionFilterAttribute
属于MVC管道。
最后但并非最不重要的是,我建议不要编写自己的自定义身份验证逻辑,而是坚持使用默认框架。这可以像使用HTTPS上的基本身份验证一样简单,也可以像实现OAuth一样复杂。但我会远离自己做的解决方案。
我还想邀请您查看this answer我提出的类似问题。
注意: ASP.NET Web Api是基于REST的,因此您根本不想保留会话信息。
编辑有关如何实现处理基本身份验证的委托处理程序的示例,请参阅:basic http authentication in asp.net web api using message handlers.
答案 1 :(得分:3)
基本上,您需要将通过网络加密的用户名和密码发送到您的服务器应用程序,然后您可以让您的API生成随机会话ID并将其保存在列表(服务器端)中并将ID发送回客户。现在,每次客户端向服务器发送内容时,请在数据包中包含他收到的ID,这样服务器每次都可以检查它。
在客户端断开连接或固定超时时,您可以从服务器列表中删除ID并要求客户端重新进行身份验证。