2017-06-11 1 views
1

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"); 
      } 
     } 

Chrome réseau Screenshotenter image description here

S'il vous plaît aidez-moi à comprendre ce que je fais mal ici?

Répondre

0

Je pense que le Direct Line supprime les en-têtes lors de la traduction et du transfert de messages à votre robot. Cependant, vous pouvez intercepter tous les messages (comme vous l'avez déjà fait) et ajouter le x-user-id comme custom channel data à chaque message. Voici un exemple de données de canal personnalisées: https://blog.botframework.com/2017/03/28/Custom-Channel-Data#c-implementation

+0

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

1

Vous devez vous rendre compte que les demandes passent toujours par les canaux correspondants (connecteurs) et que tout ce que vous ajoutez dans les en-têtes ne sera pas transmis à votre robot. Par conséquent, nous devons transmettre ces données uniquement par le biais de mécanismes pris en charge. Comme Eric l'a mentionné, une fois de cette façon tire parti de channelData. Tout ce que vous ajoutez dans channelData passera par le canal et atteindra le bot. Par conséquent, vous recommandons d'essayer la même chose.

Exemple 1:

{ "type": "conversationUpdate", "membersAdded": [], "from": { "id": "test", "name": "test" }, "serviceUrl": "https://directline.botframework.com",
"channelData":{ "userId": "test"}
}

Exemple 2:

{ "type": "message", "text": "whats your name", "from": { "id": "user1", "name": "user1" },
"channelData": { "userId": "test1234" }
} `

Espérons que cela aide.