https://d226lax1qjow5r.cloudfront.net/blog/blogposts/add-two-factor-authentication-to-a-microsoft-bot-with-nexmos-verify-api-dr/2FA-MS-BOT.png

Hinzufügen von 2FA zu einem Microsoft-Bot mit der Verify API von Nexmo

Zuletzt aktualisiert am May 3, 2021

Lesedauer: 3 Minuten

2FA (Zwei-Faktor-Authentifizierung) wird zunehmend eingesetzt, um die Sicherheit innerhalb von Applications zu erhöhen. Da Bots immer beliebter werden, müssen Entwickler überlegen, wie sie 2FA in ihre Bots integrieren können. In dieser Demo sehen wir, wie die Nexmo Verify API mit Microsoft Bot Framework verwendet werden kann.

Voraussetzungen

In diesem Beitrag werden wir nicht im Detail auf die Erstellung eines Bots eingehen. Wir gehen davon aus, dass Sie wissen, wie Sie Visual Studio für die Erstellung von Bot-Projekten einrichten. Wenn Sie mit dem Microsoft Bot-Framework nicht vertraut sind, können Sie die Dokumentationsseite hier.

Das Bot Builder SDK für .NET unterstützt derzeit C#. Visual Studio für Mac wird nicht unterstützt. Sie benötigen einen Windows-Rechner, um diese Demo ausführen zu können.

Um 2FA einzurichten, verwenden wir Nexmo Verify API und die Nexmo C# Client-Bibliothek

Vonage API-Konto

Um dieses Tutorial durchzuführen, benötigen Sie ein Vonage API-Konto. Wenn Sie noch keines haben, können Sie sich noch heute anmelden und mit einem kostenlosen Guthaben beginnen. Sobald Sie ein Konto haben, finden Sie Ihren API-Schlüssel und Ihr API-Geheimnis oben auf dem Vonage-API-Dashboard.

Wie funktioniert das?

In unserem Szenario werden wir einem Bot bei der Anmeldung eine Zwei-Faktor-Authentifizierung hinzufügen. Wenn Sie sich zum ersten Mal anmelden, müssen Sie ein paar Informationen wie Ihren Namen und Ihre Telefonnummer angeben, um Ihr Profil zu vervollständigen.

Dann wird der Bot versuchen, diese Telefonnummer zu verifizieren, indem er eine PIN über die Nexmo Verify API sendet. Der nächste Schritt besteht darin, die PIN zu sammeln und zu überprüfen.

Einrichten des Bot-Projekts

Um 2FA mit einem Bot einzurichten, müssen Sie zunächst einen Bot erstellen. Das macht doch Sinn, oder? Erstellen Sie in Visual Studio ein neues Projekt vom Typ "Bot-Anwendung": Datei--> Neu--> Projekt--> Bot-Anwendung

screenshot showing set up and saving bot projectCreating and Saving new project

Verwendung von Nexmo mit dem Bot

Die Verwendung der Nexmo-APIs mit einer Bot-Anwendung unterscheidet sich nicht von der Verwendung der APIs mit jedem anderen .Net-Projekt. Installieren Sie die Nexmo C# Client Library über die NuGet Package Manager Console.

Install-Package Nexmo.Csharp.Client -Version 3.0.1

Erstellen des Profilformulars

Um die Telefonnummer des Benutzers bei der Anmeldung zu verifizieren, werden wir ein paar Informationen sammeln, um ein Benutzerprofil zu erstellen.

Mit dem Microsoft Bot Framework gibt es einige Möglichkeiten, den Gesprächsfluss zu verwalten und Dialoge zu erstellen. In diesem Fall werden wir Folgendes verwenden FormFlow verwenden, da es den Prozess der Verwaltung einer geführten Konversation wie der unseren vereinfacht.

typing a message and getting alert to verify identity2fa Typing message

Fügen Sie dem Projekt eine Klasse "UserProfile" hinzu, die das Formular definiert. Die Klasse enthält einige Eigenschaften, die uns bei der Erstellung des Profils helfen, sowie eine Methode "BuildForm()", die den "FormBuilder" verwendet, um das Formular zu erstellen und eine einfache Willkommensnachricht zu definieren.

Stellen Sie sicher, dass Sie den Namespace FormFlow importieren, um FormFlow verwenden zu können.

Microsoft.Bot.Builder.FormFlow
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Builder.FormFlow;
using System;

namespace _2FABotDemo
{
    [Serializable]
    public class UserProfile
    {
        [Prompt("What's your first name?")]
        public string FirstName;
        [Prompt("How about your last name?")]
        public string LastName;
        [Prompt("I now need your phone number in its international format but without '+' or '00'. I will send you a verification code shortly.")]
        public string PhoneNumber;
        public static IForm<UserProfile> BuildForm()
        {
            return new FormBuilder<UserProfile>().Message("Welcome! Before I'm of any use to you, I will need to verify your identity. Please answer the following questions.")
                .OnCompletion(async (context, UserProfile) => {
                    context.PrivateConversationData.SetValue<bool>("ProfileComplete", true);
                    await context.PostAsync("Your profile is complete.");
                })
                .Build();
        }
    }
}

Verwendung des Formulars

Nun, da wir ein Profilformular haben, müssen wir es mit dem Framework verbinden, um es tatsächlich nutzen zu können. Dies geschieht durch Hinzufügen zum Controller "MessagesController.cs" über die Methode "MakeRootDialog()".

MakeRootDialog()" ruft im Gegenzug die Methode "FormDialog.FromForm" auf, um das Benutzerprofilformular zu erstellen. Sobald das Benutzerprofil ausgefüllt ist, sendet der Bot einen Verifizierungscode an die vom Benutzer angegebene Telefonnummer.

Der Übersichtlichkeit halber fassen wir die Methoden zur Überprüfung (d. h. zum Senden und Prüfen) in einer Hilfsklasse namens "VerifyHelper.cs" zusammen.

public  string RequestId { get; set; }
public Client Client { get; set; }

public VerifyHelper()
{
    Client = new Client(creds: new Nexmo.Api.Request.Credentials
    {
         ApiKey = "NEXMO_API_KEY",
         ApiSecret = "NEXMO_API_SECRET"
    });
}

public  void SendVerificationCode(string phoneNumber)
{
     var result = Client.NumberVerify.Verify(new NumberVerify.VerifyRequest
     {
          number = phoneNumber,
          brand = "NexmoQS"
     });

     RequestId = result.request_id;
}
internal static IDialog<UserProfile> MakeRootDialog() => Chain.From(() => FormDialog.FromForm(UserProfile.BuildForm))
                .Do(async (context, userprofile) =>
                {
                    SetVerify(new VerifyHelper());
                    try
                    {
                        var completed = await userprofile;
                        GetVerify().SendVerificationCode(completed.PhoneNumber);
                        await context.PostAsync("All Done! I sent a verification code to the phone number you provided. Could you please tell me the code once you receive it?");
                    }
                    catch (FormCanceledException<UserProfile> e)
                    {
                        string reply;
                        if (e.InnerException == null)
                        {
                            reply = $"You quit on {e.Last} -- maybe you can finish next time!";
                        }
                        else
                        {
                            reply = "Sorry, I've had a short circuit. Please try again.";
                        }
                        await context.PostAsync(reply);
                    }
                });

MakeRootDialog()" wird von der Methode "Conversation.SendAsync()" aufgerufen.

await Conversation.SendAsync(activity, () => MakeRootDialog());

Nachdem der Code gesendet wurde, muss er im nächsten Schritt verifiziert werden, sobald der Benutzer ihn an den Bot weitergibt.

verify setup with user provided input to the botVerify Code

Dies geschieht über die Methode "CheckVerificationCode" in "VerifyHelper.cs".

public  string CheckVerificationCode(string code)
{
     var result = Client.NumberVerify.Check(new NumberVerify.CheckRequest
     {
          request_id = RequestId,
          code = code
     });

     if (result.status == "0")
     {
         return "Verification Sucessful";
     }
     else
     {
          return result.error_text;
     }
}

Wie Sie sehen können, gibt diese Methode eine Zeichenkette zurück, da wir diese Zeichenkette verwenden wollen, um mit dem Benutzer über den Bot zu kommunizieren. Dies ist die Kennung der zu prüfenden Verify-Anfrage. Wenn wir den Verifizierungscode senden, speichern wir einfach diesen Bezeichner.

Kehren wir nun zum Bot zurück. Wir haben erwähnt, dass wir das Formular in "MessageController.cs" erstellen. Das liegt daran, dass die "Post"-Methode in "MessageController.cs" für den Empfang von Nachrichten des Benutzers verantwortlich ist und den Stammdialog aufruft.

Wenn der Benutzer also den Verifizierungscode eingibt, fängt der Bot diese Nachricht in der Post-Methode genauso ab wie die Benutzerprofilinformationen. Daher brauchen wir eine Möglichkeit, dem Bot mitzuteilen, was er als Nächstes tun soll. Wenn Sie sich die BuildForm-Methode in "UserProfile.cs" genau ansehen, werden Sie feststellen, dass wir ein bool ProfileComplete bei Fertigstellung auf true setzen.

.OnCompletion(async (context, UserProfile) => {
                    context.PrivateConversationData.SetValue<bool>("ProfileComplete", true);

Jedes Mal, wenn der Benutzer etwas eingibt, wird geprüft, ob ProfileComplete auf true gesetzt ist oder nicht. Wenn das Profil vollständig ist, wird davon ausgegangen, dass der Benutzer den Verifizierungscode eingegeben hat, und es wird geprüft, ob dieser Code gültig ist; wenn nicht, wird das Profil im Stammdialog weiter ausgefüllt.

StateClient sc = activity.GetStateClient();
                BotData userData = sc.BotState.GetPrivateConversationData(
                    activity.ChannelId, activity.Conversation.Id, activity.From.Id);

var boolProfileComplete = userData.GetProperty<bool>("ProfileComplete");

if (!boolProfileComplete)
{
   await Conversation.SendAsync(activity, () => MakeRootDialog());
}
else
{
   ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
   Activity replyMessage = activity.CreateReply(GetVerify().CheckVerificationCode(activity.Text));
   await connector.Conversations.ReplyToActivityAsync(replyMessage);
}

Kurz und bündig

Das Ziel dieser Demo ist es, Ihnen zu zeigen, wie Sie 2FA zu Ihren Microsoft Bot Applications mit Nexmo Verify API bei der Anmeldung hinzufügen können.

Wir haben ein Benutzerprofilformular erstellt und senden dann einen Verifizierungscode an die vom Benutzer angegebene Telefonnummer. Sobald der Benutzer den gesendeten Code eingibt, wird er von uns verifiziert. In unserem Blog finden Sie weitere Beispiele und Szenarien für die Nutzung der Nexmo-APIs mit Microsoft Bot Framework.

Teilen Sie:

https://a.storyblok.com/f/270183/150x150/a3d03a85fd/placeholder.svg
Rabeb OthmaniVonage Ehemalige

Rabeb war Developer Advocate bei Nexmo, wo sie sich auf Cloud-Kommunikations-APIs konzentrierte und Entwicklern half, die bestmögliche Erfahrung bei der Entwicklung ihrer Apps zu machen. Rabeb schreibt nicht nur Code für ihren Lebensunterhalt, sondern setzt sich auch dafür ein, mehr Frauen und Minderheiten in die Technologiebranche zu bringen, und engagiert sich daher bei Women Who Code und verschiedenen Tech-Communities. Sie leitet das Women Who Code Network in Bristol.