我们有一个使用WebAPI和OWIN构建的API。现在这意味着很多身份验证代码都使用OWIN类,尤其是OwinContext,但是当转换为在Azure Functions中运行时,您基本上已经变成了接收HttpRequestMessage的控制台应用程序。
为了不必重新实现我们的整个授权/身份验证方案,有没有办法在Azure Functions中使用OWIN?也许通过手动创建一个OwinContext或什么?
对不起,如果这个问题太宽泛,但我似乎无法理解这个问题。
答案 0 :(得分:3)
可能通过手动创建OwinContext或其他东西?
是的,我们可以根据请求消息手动创建它。基于protocol of OWIN,我们需要将所需的键添加到Environment字典中。以下示例代码供您参考。
Dictionary<string, object> environment = new Dictionary<string, object>();
MemoryStream requestBody = new MemoryStream();
byte[] json = Encoding.UTF8.GetBytes("{ 'a' : 'value1' }");
requestBody.Write(json, 0, json.Length);
environment.Add("owin.RequestBody", requestBody);
var headers = new Dictionary<string, string[]>();
headers.Add("host",new string[] { "myhost.com" });
headers.Add("Content-Type", new string[] { "application/json" });
environment.Add("owin.RequestHeaders", headers);
environment.Add("owin.RequestMethod", "POST");
environment.Add("owin.RequestPath", "a.html");
environment.Add("owin.RequestPathBase", "/");
environment.Add("owin.RequestProtocol", "HTTP/1.1");
environment.Add("owin.RequestQueryString", "myhost.com");
environment.Add("owin.RequestScheme", "http");
OwinContext context = new OwinContext(environment);
context.Environment.Add("owin.ResponseHeaders", new Dictionary<string, string[]>());
context.Environment.Add("owin.ResponseBody", new MemoryStream());