2017-04-30 1 views
2

Ich benutze Bot Framework und AzureAuthDialog, um den Benutzer zu authentifizieren.So leiten Sie die Nachricht des Benutzers zur Authentifizierung weiter

Der Bot fragt zuerst den Benutzer, was er will. Wann immer der Benutzer eine Nachricht schreibt, überprüfen wir, ob er authentifiziert ist oder nicht. Wenn wir feststellen, dass er nicht authentifiziert ist, möchten wir ihn bitten, sich zu authentifizieren. Sobald er die Authentifizierung abgeschlossen hat, möchte ich seine Anfrage von vor der Authentifizierung weiter bearbeiten.

Auf der anderen Seite, was derzeit geschieht ist, dass, nachdem der Benutzer authentifiziert, verlieren wir die Benutzer Nachricht. Hier ist der Code, siehe die Kommentare inline mehr verstehen:

public class IntentHandler : LuisDialog<object> 
    { 
protected override async Task MessageReceived(IDialogContext context, IAwaitable<IMessageActivity> item) 
     { 
      if (!await context.IsUserAuthenticated(m_resourceId)) 
      { 
// this has the user's message 
       var message = await item; 
// The next thing that is called here is ResumeAfterAuth function, but it does not have the user's message anymore 
       await context.Forward(new AzureAuthDialog(m_resourceId), ResumeAfterAuth, message, CancellationToken.None); 
      } 
      else 
      { 
       await base.MessageReceived(context, item); 
      } 
     } 

     private async Task ResumeAfterAuth(IDialogContext context, IAwaitable<string> item) 
     { 
// this does not have the users's message, it only includes "User is loged in" 
       var message = await item; 
       await context.PostAsync(message); 
       PrivateTracer.Tracer.TraceInformation($"User {context.GetUserMail()} signed in"); 
       await context.PostAsync(c_welcomeQuestion); 
      } 
    } 

Jede Idee, wie die Benutzer Nachricht zu übergeben aus der Zeit vor der Authentifizierung? Ich weiß, ich kann die Nachricht des Benutzers in einem Feld auf MessageReceived enter code here speichern, aber das scheint zu hässlich. Gibt es eine andere Art und Weise?

+0

Ist AzureAuthDialog von AuthBot oder ist benutzerdefinierte eine von Ihnen erstellt? –

+0

Es ist von Auth bot –

Antwort

1

Die IAwaitable in Ihrem ResumeAfterAuth Methode ist das Ergebnis des Dialogs, die Sie (AzureAuthDialog), nicht den ursprünglichen Benutzer-Nachricht bezeichnet.

Wenn Sie die AzureAuthDialog nicht gehört, müssen Sie um sich die ursprüngliche Nachricht halten und es zu einem Rückruf (ResumeAfterAuth) übergeben. Man könnte es als Mitglied Variable Ihre Dialogklasse halten oder durch clousure auf einer Lambda-Funktion, so etwas wie diese:

if (!await context.IsUserAuthenticated(m_resourceId)) 
{  
    var initialUserText = (await item).Text; 
    await context.Forward(new AzureAuthDialog(m_resourceId), (_context, _item) => ResumeAfterAuth(_context, _item, initialUserText), message, CancellationToken.None); 
} 

Und Ihre Callback-Methode Unterschrift würde wie folgt aussehen:

private async Task ResumeAfterAuth(IDialogContext context, IAwaitable<string> item, string initialUserText) 

Wenn Sie eigene AzureAuthDialog, ich denke, Sie sind besser dran, indem es Ihnen den ursprünglichen Benutzertext zurückgegeben, wenn Sie fertig sind.

BEARBEITEN: Sie müssen das BotFramework so konfigurieren, dass es Verschlüsse serialisiert, wenn Sie dies nicht getan haben, wie described here. Sie können es tun, indem Sie diese zu Ihren Diensten des Start-up-Methode:

var builder = new ContainerBuilder(); 
builder.RegisterModule(new ReflectionSurrogateModule()); 
builder.Update(Conversation.Container); 
0

Was erwähnte @andre ein Weg, es zu tun, die andere beste Art und Weise, ist die Benutzernachricht in einer lokalen Variablen zu speichern und dann rufen Die base.MessageReceived-Funktion nach der Authentifizierung übergibt die gespeicherte Benutzermeldung an sie. Der Code wird in der Regel in etwa wie folgt aussehen:

Verwandte Themen