我创建了一个新的ASP.NET Web API,目前一切都运行良好。现在我想保护这个API。
我将[Authorize]属性放置在我的基本控制器上,并且如果我想要在ASP.NET应用程序内进行API调用,那么它可以正常工作。
然而,我正在思考,对于想要进行API调用并通过授权的外部客户端,最佳实践是什么?还要考虑到我自定义的身份验证逻辑。
客户端应该如何发送凭据?何时处理这些凭据?
我创建了一个新的ASP.NET Web API,目前一切都运行良好。现在我想保护这个API。
我将[Authorize]属性放置在我的基本控制器上,并且如果我想要在ASP.NET应用程序内进行API调用,那么它可以正常工作。
然而,我正在思考,对于想要进行API调用并通过授权的外部客户端,最佳实践是什么?还要考虑到我自定义的身份验证逻辑。
客户端应该如何发送凭据?何时处理这些凭据?
我该如何发送客户端凭证?
发送身份验证信息的默认位置是授权头。您可以使用此选项进行基本身份验证,还可以用于其他类型的身份验证(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
并使用它来解析您的“principal”。然后,您可以将其设置为HttpContext.CurrentPrincipal
,以便在请求范围内需要它的任何位置都可以使用。正如您在下面的图像中所看到的那样,DelegatingHandler
是在控制器之前调用的,这使其非常适合进行身份验证逻辑。
我会在客户端上做同样的事情(编写DelegatingHandler
或ActionFilterAttribute
),以便在默认位置添加身份验证标头。请注意,DelegatingHandler
是HTTP管道的一部分,而ActionFilterAttribute
属于MVC管道。
最后但并非最不重要的是,我建议您不要编写自己的自定义身份验证逻辑,而是坚持使用默认框架之一。这可以只是使用HTTPS上的基本身份验证,也可以实现OAuth等复杂方案。但我会远离自行解决方案。
我还想邀请您查看我回答的一个类似问题的答案。
注意:ASP.NET Web Api是基于REST的,所以个人认为您不想保留会话信息。
编辑:有关如何实现处理基本身份验证的委托处理程序的示例,请参见:使用消息处理程序在asp.net web api中进行基本http身份验证。