Ajax 在OWIN身份验证中读取自定义请求头
我正在尝试使用OWIN向MS Bot framework项目提供额外/自定义身份验证,而不是使用app id/pwd从MS提供默认身份验证。是的,Bot实际上也是一个我标记为Webapi的api。我添加了OWIN启动类,并提供了中间件来执行OAUTH-2实现以验证JWT 由于MS Bot directline调用有一个作为授权头密钥传递的默认承载令牌,所以我给了定制提供者从Bot状态接受JWT。请注意,我的bot出现在一个Web应用程序中,该应用程序将生成一个身份验证令牌,该令牌将根据唯一的用户id设置为bot状态,因此我需要此用户id值来从bot状态检索令牌。因此,我能想到的最好的方法是拦截来自Webchat Bot控件的所有ajax调用,以添加一个自定义标题“x-user-id”,我将从我的owin中间件请求标题中读取该标题 但是它没有成功,因为我没有在OWIN中获得头值,我正在通过ajax调用传递头值。但是当我登录Chrome时,这个标题被发送了。我对可能出现的问题感到困惑 Ajax拦截器Ajax 在OWIN身份验证中读取自定义请求头,ajax,c#-4.0,asp.net-web-api2,owin,botframework,Ajax,C# 4.0,Asp.net Web Api2,Owin,Botframework,我正在尝试使用OWIN向MS Bot framework项目提供额外/自定义身份验证,而不是使用app id/pwd从MS提供默认身份验证。是的,Bot实际上也是一个我标记为Webapi的api。我添加了OWIN启动类,并提供了中间件来执行OAUTH-2实现以验证JWT 由于MS Bot directline调用有一个作为授权头密钥传递的默认承载令牌,所以我给了定制提供者从Bot状态接受JWT。请注意,我的bot出现在一个Web应用程序中,该应用程序将生成一个身份验证令牌,该令牌将根据唯一的用户
if (window.XMLHttpRequest && !(window.ActiveXObject)) {
(function (send) {
XMLHttpRequest.prototype.send = function (data) {
this.setRequestHeader('x-user-id', '123456789');
send.call(this, data);
};
})(XMLHttpRequest.prototype.send);
}
AppBuilder配置
public void Configuration(IAppBuilder app)
{
var policy = new CorsPolicy()
{
AllowAnyHeader = true,
AllowAnyMethod = true,
AllowAnyOrigin = true,
SupportsCredentials = true
};
policy.ExposedHeaders.Add("x-user-id");
app.UseCors(new CorsOptions()
{
PolicyProvider = new CorsPolicyProvider
{
PolicyResolver = context => Task.FromResult(policy)
}
});
app.Map("/api", ctx =>
{
ctx.UseEsoAccessTokenValidation(new EsoAccessTokenOptions
{
AccessTokenKey = "AccessToken",
ChannelId = "webchat",
Scopes = new string[] { "read", "write" }
});
ctx.UseWebApi(WebApiConfig.Register());
});
}
读取标题的代码:
private static async Task<string> GetAccessToken(OAuthRequestTokenContext context, EsoAccessTokenOptions options)
{
string accesstoken = string.Empty;
var request = context.Request;
if (request.Headers.ContainsKey("x-user-id"))
{
userid = request.Headers.Get("x-user-id");
}
}
private静态异步任务GetAccessToken(OAuthRequestTokenContext上下文,EsoAccessTokenOptions)
{
string accesstoken=string.Empty;
var-request=context.request;
if(request.Headers.ContainsKey(“x-user-id”))
{
userid=request.Headers.Get(“x-user-id”);
}
}
Chrome网络截图
请帮助我理解我在这里做错了什么?我认为
直达行在翻译邮件并将其传输到您的机器人时会剥离邮件头。但是,您可以截取所有消息(就像您已经做的那样),并将x-user-id
作为自定义频道数据添加到每条消息中。下面是一个自定义通道数据的示例:需要认识到,请求总是通过相应的通道(连接器)传递,而不是您作为头的一部分添加的所有内容都将传递给您的bot。因此,我们只需要通过受支持的机制传递此类数据。正如Eric所提到的,一旦这样的方式利用了channelData。作为channelData的一部分添加的任何内容都将通过通道到达机器人。因此,建议您尝试同样的方法
例1:
{
“类型”:“会话更新”,
“成员名单”:[],
“发件人”:{
“id”:“测试”,
“名称”:“测试”
},
“服务URL”:https://directline.botframework.com“,
“channelData”:{“userId”:“test”}
}
例2:
{
“类型”:“消息”,
“文本”:“你叫什么名字”,
“发件人”:{
“id”:“user1”,
“名称”:“user1”
},
“信道数据”:{
“userId”:“test1234”
}
}`
希望这能有所帮助。您能告诉我如何拦截来自客户端的ajax调用并在正文中添加内容吗?。As活动对象作为所有post调用的主体传递