J'essaie de fournir une authentification supplémentaire/personnalisée au projet MS Bot-framework en utilisant OWIN autre que l'authentification par défaut de MS en utilisant app id/pwd. Oui le Bot est en fait un api j'ai tagué Webapi aussi. J'ai ajouté la classe de démarrage OWIN et fourni un middleware pour effectuer l'implémentation d'OAUTH-2 afin de valider JWT.Lire l'en-tête de requête personnalisée dans l'authentification OWIN
Étant donné que les appels de ligne directe MS Bot ont un jeton de support par défaut à transmettre en tant que clé d'en-tête d'autorisation, j'ai donné un fournisseur personnalisé pour accepter JWT de l'état de robot. Veuillez noter que mon bot est apparu dans une application Web qui génèrera un jeton d'authentification qui sera placé dans l'état Bot par rapport à l'identifiant unique, donc j'ai besoin de cette valeur d'identifiant pour récupérer le jeton de l'état Bot. Donc le meilleur moyen que je puisse penser est d'intercepter tous les appels ajax de mon contrôle Webchat Bot pour ajouter un en-tête personnalisé comme "x-user-id", que je lirai depuis mon entête de requête middleware owin.
Mais cela n'a pas abouti car je ne reçois pas la valeur d'en-tête dans OWIN, que je passe dans les appels ajax. Mais quand j'ai vérifié dans Chrome, cet en-tête est envoyé. Je suis confus sur ce qui pourrait être le problème.
Ajax Interceptor
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 Configuration
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());
});
}
code à lire en-tête:
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");
}
}
S'il vous plaît aidez-moi à comprendre ce que je fais mal ici?
Pouvez-vous s'il vous plaît me dire comment puis-je intercepter les appels ajax du côté client et ajouter quelque chose au corps ?. Comme objet d'activité est passé en tant que corps pour tous les appels post – Satheesh