Ajax 在OWIN身份验证中读取自定义请求头

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应用程序中,该应用程序将生成一个身份验证令牌,该令牌将根据唯一的用户

我正在尝试使用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拦截器

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调用的主体传递