验证ASP.NET Web API

时间:2013-11-05 16:25:50

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

我已经创建了一个新的ASP.NET Web API,但事情进展顺利。我现在正处于确保API安全的地步。

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

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

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

2 个答案:

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

enter image description here

我会在客户端上执行相同操作(编写DelegatingHandlerActionFilterAttribute)以在默认位置添加身份验证标头。请注意,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并要求客户端重新进行身份验证。