ASP.NET MVC 5-App mit zweistufiger Authentifizierung per SMS und E-Mail
von Rick Anderson
In diesem Tutorial wird das Erstellen einer ASP.NET MVC 5-Web-App mit zweistufiger Authentifizierung gezeigt. Sie sollten Erstellen einer sicheren ASP.NET MVC 5 Web-App mit Anmeldung, E-Mail-Bestätigung und Zurücksetzen des Kennworts abschließen, bevor Sie fortfahren. Sie können die fertige Anwendung hier herunterladen. Der Download enthält Hilfsprogramme für das Debuggen, mit denen Sie die E-Mail-Bestätigung und SMS testen können, ohne einen E-Mail- oder SMS-Anbieter einzurichten.
Dieses Tutorial wurde von Rick Anderson ( Twitter: @RickAndMSFT ) geschrieben.
- Erstellen einer ASP.NET MVC 5-App
- Einrichten von SMS für zweistufige Authentifizierung
- Aktivieren der zweistufigen Authentifizierung
- Zusätzliche Ressourcen
Erstellen einer ASP.NET MVC 5-App
Beginnen Sie mit der Installation und führen Sie Visual Studio Express 2013 für Web oder höher aus.
Hinweis
Warnung: Sie sollten Erstellen einer sicheren ASP.NET MVC 5 Web-App mit Anmeldung, E-Mail-Bestätigung und Zurücksetzen des Kennworts abschließen, bevor Sie fortfahren. Sie müssen Visual Studio 2013 Update 3 oder höher installieren, um dieses Tutorial abzuschließen.
- Erstellen Sie ein neues ASP.NET-Webprojekt, und wählen Sie die MVC-Vorlage aus. Web Forms unterstützt auch die ASP.NET-Identität, sodass Sie ähnliche Schritte in einer Webformular-App ausführen können.
- Belassen Sie die Standardauthentifizierung bei Individuelle Benutzerkonten. Wenn Sie die App in Azure hosten möchten, lassen Sie das Kontrollkästchen aktiviert. Im weiteren Verlauf des Tutorials werden wir die Bereitstellung in Azure vornehmen. Sie können ein Azure-Konto kostenlos eröffnen.
- Legen Sie fest, dass das Projekt SSL verwenden soll.
Einrichten von SMS für zweistufige Authentifizierung
Dieses Tutorial enthält Anweisungen zur Verwendung von Twilio oder ASPSMS, aber Sie können auch jeden anderen SMS-Anbieter verwenden.
Erstellen eines Benutzerkontos bei einem SMS-Anbieter
Installieren zusätzlicher Pakete oder Hinzufügen von Dienst-Referenzen
Twilio:
Geben Sie in der Paket-Manager-Konsole den folgenden Befehl ein:
Install-Package Twilio
ASPSMS:
Die folgende Dienst-Referenz muss hinzugefügt werden:Adresse:
https://webservice.aspsms.com/aspsmsx2.asmx?WSDL
Namespace:
ASPSMSX2
Ermittlung der Anmeldeinformationen für SMS-Anbieter Benutzer
Es wird empfohlen, die sicherste Authentifizierungsoption zu verwenden. Informationen zu .NET-Apps, die in Azure bereitgestellt werden, finden Sie unter:
Azure Key Vault und .NET Aspire bieten die sicherste Möglichkeit zum Speichern und Abrufen von Geheimschlüsseln. Der Azure Key Vault-Clouddienst schützt Verschlüsselungsschlüssel und Geheimnisse (wie Zertifikate, Verbindungszeichenfolgen und Kennwörter). Informationen zu .NET Aspire finden Sie unter sichere Kommunikation zwischen Hosting- und Clientintegrationen.
Vermeiden Sie die Vergabe von Anmeldeinformationen für das Kennwort des Besitzers von Ressourcen, da dies:
- Macht das Benutzerkennwort für den Client sichtbar.
- Stellt ein erhebliches Sicherheitsrisiko dar.
- Sollte nur verwendet werden, wenn andere Authentifizierungsflows nicht möglich sind.
Wenn die App auf einem Testserver bereitgestellt wird, kann eine Umgebungsvariable verwendet werden, um die Verbindungszeichenfolge auf einen echten Testdatenbankserver festzulegen. Umgebungsvariablen werden im Allgemeinen in unverschlüsseltem Nur-Text gespeichert. Wenn der Computer oder Prozess kompromittiert ist, können nicht vertrauenswürdige Parteien auf die Umgebungsvariablen zugreifen. Wir raten davon ab, Umgebungsvariablen zum Speichern einer Produktions-Verbindungszeichenfolge zu verwenden, da dies nicht der sicherste Ansatz ist.
Richtlinien für Konfigurationsdaten:
- Speichern Sie nie Kennwörter oder andere vertrauliche Daten im Konfigurationsanbietercode oder in Nur-Text-Konfigurationsdateien.
- Verwenden Sie keine Produktionsgeheimnisse in Entwicklungs- oder Testumgebungen.
- Geben Sie Geheimnisse außerhalb des Projekts an, damit sie nicht versehentlich in ein Quellcoderepository übernommen werden können.
Twilio:
Kopieren Sie auf der Registerkarte Dashboard Ihres Twilio-Kontos die Konto-SID und das Authentifizierungstoken.
ASPSMS:
Navigieren Sie in Ihren Kontoeinstellungen zu Benutzerkennwort und kopieren Sie es zusammen mit Ihrem selbst festgelegten Kennwort.
Wir speichern diese Werte später in der web.config-Datei in den Schlüsseln "SMSAccountIdentification"
und "SMSAccountPassword"
.
4. Festlegen von SenderID/Absender
Twilio:
Kopieren Sie auf der Registerkarte Nummern Ihre Twilio-Telefonnummer.
ASPSMS:
Im Menü Absender freischalten schalten Sie einen oder mehrere Absender frei oder wählen einen alphanumerischen Absender (wird nicht von allen Netzwerken unterstützt).
Wir speichern diesen Wert später in der web.config-Datei im Schlüssel "SMSAccountFrom"
.
5. Übertragen von Zugangsdaten des SMS-Anbieters in die App
Stellen Sie der App die Anmeldeinformationen und die Absenderrufnummer zur Verfügung. Der Einfachheit halber speichern wir diese Werte in der Datei web.config. Bei der Bereitstellung in Azure können wir die Werte sicher im Abschnitt App-Einstellungen auf der Registerkarte "Konfigurieren" der Website speichern.
[!code-xml[Main](aspnet-mvc-5-app-with-sms-and-email-two-factor-authentication/samples/sample1.xml?highlight=8-10)]
> [!WARNING]
> Security - Never store sensitive data in your source code. The account and credentials are added to the code above to keep the sample simple. See [Best practices for deploying passwords and other sensitive data to ASP.NET and Azure](../../../identity/overview/features-api/best-practices-for-deploying-passwords-and-other-sensitive-data-to-aspnet-and-azure.md).
Implementierung der Datenübertragung an SMS-Anbieter
Konfigurieren Sie die
SmsService
-Klasse in der Datei App_Start\IdentityConfig.cs.Je nach verwendetem SMS-Anbieter aktivieren Sie entweder den Twilio oder den ASPSMS Abschnitt:
public class SmsService : IIdentityMessageService { public Task SendAsync(IdentityMessage message) { // Twilio Begin //var accountSid = ConfigurationManager.AppSettings["SMSAccountIdentification"]; //var authToken = ConfigurationManager.AppSettings["SMSAccountPassword"]; //var fromNumber = ConfigurationManager.AppSettings["SMSAccountFrom"]; //TwilioClient.Init(accountSid, authToken); //MessageResource result = MessageResource.Create( //new PhoneNumber(message.Destination), //from: new PhoneNumber(fromNumber), //body: message.Body //); ////Status is one of Queued, Sending, Sent, Failed or null if the number is not valid //Trace.TraceInformation(result.Status.ToString()); ////Twilio doesn't currently have an async API, so return success. //return Task.FromResult(0); // Twilio End // ASPSMS Begin // var soapSms = new MvcPWx.ASPSMSX2.ASPSMSX2SoapClient("ASPSMSX2Soap"); // soapSms.SendSimpleTextSMS( // System.Configuration.ConfigurationManager.AppSettings["SMSAccountIdentification"], // System.Configuration.ConfigurationManager.AppSettings["SMSAccountPassword"], // message.Destination, // System.Configuration.ConfigurationManager.AppSettings["SMSAccountFrom"], // message.Body); // soapSms.Close(); // return Task.FromResult(0); // ASPSMS End } }
Aktualisieren Sie die Views\Manage\Index.cshtml Razor-Ansicht: (Hinweis: Entfernen Sie nicht einfach die Kommentare im bestehenden Code, sondern verwenden Sie den folgenden Code).
@model MvcPWy.Models.IndexViewModel @{ ViewBag.Title = "Manage"; } <h2>@ViewBag.Title.</h2> <p class="text-success">@ViewBag.StatusMessage</p> <div> <h4>Change your account settings</h4> <hr /> <dl class="dl-horizontal"> <dt>Password:</dt> <dd> [ @if (Model.HasPassword) { @Html.ActionLink("Change your password", "ChangePassword") } else { @Html.ActionLink("Create", "SetPassword") } ] </dd> <dt>External Logins:</dt> <dd> @Model.Logins.Count [ @Html.ActionLink("Manage", "ManageLogins") ] </dd> <dt>Phone Number:</dt> <dd> @(Model.PhoneNumber ?? "None") [ @if (Model.PhoneNumber != null) { @Html.ActionLink("Change", "AddPhoneNumber") @: | @Html.ActionLink("Remove", "RemovePhoneNumber") } else { @Html.ActionLink("Add", "AddPhoneNumber") } ] </dd> <dt>Two-Factor Authentication:</dt> <dd> @if (Model.TwoFactor) { using (Html.BeginForm("DisableTwoFactorAuthentication", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) { @Html.AntiForgeryToken() <text>Enabled <input type="submit" value="Disable" class="btn btn-link" /> </text> } } else { using (Html.BeginForm("EnableTwoFactorAuthentication", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) { @Html.AntiForgeryToken() <text>Disabled <input type="submit" value="Enable" class="btn btn-link" /> </text> } } </dd> </dl> </div>
Stellen Sie sicher, dass die
EnableTwoFactorAuthentication
undDisableTwoFactorAuthentication
Aktionsmethoden in derManageController
das Attribut [ValidateAntiForgeryToken] haben:// // POST: /Manage/EnableTwoFactorAuthentication [HttpPost,ValidateAntiForgeryToken] public async Task<ActionResult> EnableTwoFactorAuthentication() { await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true); var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (user != null) { await SignInAsync(user, isPersistent: false); } return RedirectToAction("Index", "Manage"); } // // POST: /Manage/DisableTwoFactorAuthentication [HttpPost, ValidateAntiForgeryToken] public async Task<ActionResult> DisableTwoFactorAuthentication() { await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), false); var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (user != null) { await SignInAsync(user, isPersistent: false); } return RedirectToAction("Index", "Manage"); }
Führen Sie die App aus, und melden Sie sich mit dem Konto an, das Sie zuvor registriert haben.
Klicken Sie auf Ihre Benutzer-ID, wodurch die
Index
Aktionsmethode imManage
Controller aktiviert wird.
Klicken Sie auf Hinzufügen.
Die
AddPhoneNumber
-Aktionsmethode zeigt ein Dialogfeld an, um eine Telefonnummer einzugeben, die SMS-Nachrichten empfangen kann.// GET: /Account/AddPhoneNumber public ActionResult AddPhoneNumber() { return View(); }
In einigen Sekunden erhalten Sie eine SMS mit dem Bestätigungscode. Geben Sie sie ein und drücken Sie Senden.
Die Verwaltungsansicht zeigt, dass Ihre Telefonnummer hinzugefügt wurde.
Aktivieren der zweistufigen Authentifizierung
In der mit der Vorlage generierten App müssen Sie die Benutzeroberfläche verwenden, um die Zwei-Faktor-Authentifizierung (2FA) zu aktivieren. Um 2FA zu aktivieren, klicken Sie in der Navigationsleiste auf Ihre Benutzer-ID (E-Mail-Alias).
Klicken Sie auf „2FA aktivieren“.
Melden Sie sich ab und dann wieder an. Wenn Sie E-Mail aktiviert haben (siehe mein vorheriges Tutorial), können Sie SMS oder E-Mail für 2FA auswählen.
Die Seite „Code überprüfen“, auf der Sie den Code eingeben können (von SMS oder E-Mail), wird angezeigt.
Wenn Sie auf das Kontrollkästchen Diesen Browser merken klicken, müssen Sie sich nicht mit 2FA anmelden, wenn Sie den Browser und das Gerät verwenden, bei dem Sie das Kontrollkästchen markiert haben. Solange sich schädliche Benutzer keinen Zugang zu Ihrem Gerät verschaffen können, ermöglicht Ihnen die Aktivierung von 2FA und das Anklicken des Kästchens Diesen Browser merken einen bequemen Zugriff auf das Kennwort in einem Schritt, während der starke 2FA-Schutz für alle Zugriffe von nicht vertrauenswürdigen Geräten erhalten bleibt. Sie können diese Einstellung auf jedem privaten Gerät vornehmen, das Sie regelmäßig verwenden.
Dieses Tutorial bietet eine kurze Einführung in die Aktivierung von 2FA für eine neue ASP.NET MVC-App. Mein Tutorial Zwei-Faktor-Authentifizierung mit SMS und E-Mail unter Verwendung von ASP.NET Identity bietet eine detaillierte Erklärung des Quellcodes im Beispiel.
Weitere Ressourcen
- Zweistufige Authentifizierung mit SMS und E-Mail mit ASP.NET-Identität enthält ausführliche Informationen zur zweistufigen Authentifizierung.
- Links zu empfohlenen ASP.NET Identity Ressourcen
- Kontobestätigung und Kennwortwiederherstellung mit ASP.NET Identity Ausführlichere Informationen zur Kennwortwiederherstellung und Kontobestätigung.
- MVC 5 App mit Facebook, Twitter, LinkedIn und Google OAuth2-Anmeldung Dieses Tutorial zeigt Ihnen, wie Sie eine ASP.NET MVC 5-App mit Facebook- und Google-OAuth2-Autorisierung schreiben. Außerdem wird gezeigt, wie sie der Identitätsdatenbank zusätzliche Daten hinzufügen.
- Bereitstellen einer sicheren ASP.NET MVC-Anwendung mit Mitgliedschaft, OAuth und SQL-Datenbank in Azure Web. In diesem Lernprogramm fügen Sie die Bereitstellung in Azure hinzu, sichern Ihre App mit Rollen, verwenden die Mitgliedschafts-API, um Benutzer und Rollen hinzuzufügen, und integrieren zusätzliche Sicherheitsfunktionen.
- Erstellen einer Google-App für OAuth 2 und Verbinden der App mit dem Projekt
- Erstellen der App in Facebook und Verbinden der App mit dem Projekt
- Einrichten von SSL im Projekt
- Einrichten Ihrer C#- und ASP.NET MVC-Entwicklungsumgebung