validationASP.NET Web API

我已经创建了一个新的ASP.NET Web API,并且运行良好。 我现在正处于我想要保护API的地步。

我把[Authorize]属性放在我的基本控制器上面,如果我想在ASP.NET应用程序本身内进行API调用,它就能正常工作。

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

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

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

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

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== 

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

 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 ,如下图所示,这使其成为身份validation逻辑的理想选择。

在此处输入图像描述

我会在客户端上执行相同的操作(编写DelegatingHandlerActionFilterAttribute )以在默认位置添加身份validation标头。 请注意, DelegatingHandler是HTTP管道的一部分, ActionFilterAttribute属于MVC管道。

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

我还想邀请你看看我给同一个问题的答案 。

注意: ASP.NET Web Api是基于REST的,因此您根本不想保留会话信息。

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

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

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