{"id":55000133,"date":"2018-04-01T00:00:00","date_gmt":"2020-03-27T19:32:16","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=133"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Authentifizierung_unter_ASPNET_Core","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Authentifizierung_unter_ASPNET_Core\/","title":{"rendered":"Authentifizierung unter ASP.NET Core"},"content":{"rendered":"<p><b>In weiteren Artikeln dieser Ausgabe haben wir uns mit ASP.NET Core und den Razor Pages besch&auml;ftigt. Der vorliegende Artikel zeigt, wie Sie beim Erstellen eines neuen Projekts automatisch die Elemente f&uuml;r eine Benutzerverwaltung zum Projekt hinzuf&uuml;gen k&ouml;nnen. Damit werden automatisch etwa die notwendigen Datenbanktabellen angelegt und Elemente f&uuml;r die Anmeldung und die Registrierung hinzugef&uuml;gt.<\/b><\/p>\n<p>Wenn Sie eine Webanwendung bauen wollen, die dynamische Inhalte anzeigt, sind Sie mit ASP.NET Core und den Razor Pages aktuell auf der richtigen Seite. In vielen F&auml;llen sollen solche Webanwendungen nicht nur dynamische Inhalte anzeigen, sondern diese unter Umst&auml;nden teilweise nur angemeldeten Benutzern bereitstellen. Das ist ja beispielsweise auch bei den Artikeln und Downloads zu diesem Magazin der Fall &#8211; als Kunde k&ouml;nnen Sie sich im Shop unter <b>shop.minhorst.com <\/b>anmelden, nachdem Sie sich registriert haben, und erhalten dann Zugriff auf einen Bereich namens <b>Meine Sofortdownloads<\/b>. Oder Sie schauen die einzelnen Artikel im HTML-Format im Know-how-Bereich der Seite ein. Auch hier wird gepr&uuml;ft, ob &uuml;berhaupt ein Benutzer angemeldet ist und falls ja, ob er das Produkt mit den gew&uuml;nschten Inhalten abonniert hat.<\/p>\n<p>Wenn Sie selbst eine Internetseite mit einem gesch&uuml;tzten Bereich programmieren wollen, auf den nur angemeldete Benutzer zugreifen k&ouml;nnen, haben Sie eine Menge Arbeit vor sich. Sie m&uuml;ssen Datenbanktabellen erstellen, welche die Benutzer und ihre Berechtigungen verwalten und gegebenenfalls auch noch Benutzergruppen definieren. Sie ben&ouml;tigen eine Seite, auf der Benutzer sich registrieren k&ouml;nnen und eine weitere Seite, auf der sie sich sp&auml;ter erneut einloggen k&ouml;nnen. Die Registrierungsseite muss Automatismen aufweisen, die pr&uuml;fen, ob der Benutzername bereits vorhanden ist und ob das Kennwort den gew&uuml;nschten Konventionen entspricht &#8211; zum Beispiel hinsichtlich der Mindestanzahl von Zeichen und Sonderw&uuml;nschen wir das Vorkommen von Zahlen, gro&szlig;en Buchstaben oder Sonderzeichen. Dann muss die Seite daf&uuml;r sorgen, dass der neue Benutzer angelegt wird.<\/p>\n<p>Die Login-Seite soll die Daten des registrierten Benutzers, also Benutzername und Kennwort, entgegennehmen und f&uuml;r die aktuelle Session speichern, welcher Benutzer angemeldet ist. Au&szlig;erdem soll die Anwendung jederzeit pr&uuml;fen k&ouml;nnen, ob aktuell ein Benutzer angemeldet ist.<\/p>\n<p>Wenn Sie das alles selbst programmieren wollen, haben Sie eine Weile zu tun. Doch warum sollte man, wenn es dazu fertige Pakete gibt, die Sie direkt beim Anlegen des Projekts zu diesem hinzuf&uuml;gen k&ouml;nnen<\/p>\n<h2>Projekt mit Authentifizierung anlegen<\/h2>\n<p>Um ein Projekt direkt mit Authentifizierung anzulegen, erstellen Sie dieses zun&auml;chst wie gewohnt &uuml;ber den Dialog <b>Neues Projekt <\/b>unter dem gew&uuml;nschten Namen und Verzeichnis (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_133_001.png\" alt=\"Anlegen eines neuen Projekts auf Basis der Vorlage ASP.NET Core Webanwendung\" width=\"649,559\" height=\"376,0169\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Anlegen eines neuen Projekts auf Basis der Vorlage ASP.NET Core Webanwendung<\/span><\/b><\/p>\n<p>Im n&auml;chsten Schritt w&auml;hlen Sie als Projekttyp den Eintrag <b>Webanwendung <\/b>aus. Hier finden Sie au&szlig;erdem die Schaltfl&auml;che <b>Authentifizierung &auml;ndern <\/b>(siehe Bild 2). Bisher zeigt der Text darunter noch den Wert <b>Keine Authentifizierung <\/b>als Authentifizierungsmethode an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_133_002.png\" alt=\"Aktivieren des Eintrags Webanwendung und Klick auf Authentifizierung &auml;ndern\" width=\"624,576\" height=\"439,428\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Aktivieren des Eintrags Webanwendung und Klick auf Authentifizierung &auml;ndern<\/span><\/b><\/p>\n<p>Das &auml;ndern wir nach dem Anklicken der Schaltfl&auml;che im Dialog <b>Authentifizierung &auml;ndern <\/b>(siehe Bild 3). Hier haben Sie die folgenden Wahlm&ouml;glichkeiten:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_133_003.png\" alt=\"Einstellen der Authentifizierungsmethode\" width=\"549,6265\" height=\"209,8038\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Einstellen der Authentifizierungsmethode<\/span><\/b><\/p>\n<ul>\n<li><b>Keine Authentifizierung<\/b>: Es werden keine Elemente zur Unterst&uuml;tzung einer Authentifizierung angelegt.<\/li>\n<li><b>Einzelne Benutzerkonten<\/b>: Die Benutzerkonten werden lokal gespeichert, in diesem Fall in der Datenbank der Anwendung.<\/li>\n<li><b>Gesch&auml;fts-, Schul oder Unikonten<\/b>: Die Authentifizierung erfolgt &uuml;ber Active Directory, Microsoft Azure Active Directory oder Office 365.<\/li>\n<li><b>Windows-Authentifizierung<\/b>: Die Authentifizierung basiert auf den Windows-Konten. Diese Methode ist etwa f&uuml;r Intranet-Anwendungen geeignet.<\/li>\n<\/ul>\n<p>Wir wollen eine Webanwendung f&uuml;r beliebig viele Benutzer programmieren und nutzen daher die Option <b>Einzelne Benutzerkonten<\/b>. Dabei behalten wir die Einstellung <b>In-App-Speicherung von Benutzerkonten <\/b>bei, da wir eine lokale Datenbank f&uuml;r die Benutzerdaten nutzen wollen.<\/p>\n<p>Was ist nun der Unterschied zu einer Anwendung ohne Authentifizierung Dazu starten wir die Anwendung zun&auml;chst einmal. Dabei erhalten wir die Meldung aus Bild 4. Im Gegensatz zur Webanwendung ohne Authentifizierung verwendet diese hier eine SSL-Verschl&uuml;sselung. Das macht Sinn, denn niemand m&ouml;chte Kennw&ouml;rter im Klartext &uuml;ber das Internet verschicken.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_133_004.png\" alt=\"Hinweis auf die Verwendung von SSL\" width=\"424,7115\" height=\"186,139\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Hinweis auf die Verwendung von SSL<\/span><\/b><\/p>\n<p>Die n&auml;chste Meldung k&uuml;ndigt an, dass f&uuml;r den Rechner <b>localhost<\/b>, also den aktuellen Rechner, ein Zertifikat installiert wird (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_133_005.png\" alt=\"Installation eines Zertifikats auf dem Localhost\" width=\"424,7115\" height=\"417,5131\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Installation eines Zertifikats auf dem Localhost<\/span><\/b><\/p>\n<p>Nach dem Starten der Webanwendung zeigen sich zun&auml;chst keine offensichtlichen &Auml;nderungen. Erst ein Blick nach oben rechts liefert zwei Men&uuml;eintrage, die bei dem Projekt ohne Authentifizierung noch nicht vorhanden waren &#8211; n&auml;mlich <b>Register <\/b>und <b>Log in <\/b>(siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_133_006.png\" alt=\"Zwei neue Eintr&auml;ge zum Registrieren und Einloggen\" width=\"549,6265\" height=\"145,548\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Zwei neue Eintr&auml;ge zum Registrieren und Einloggen<\/span><\/b><\/p>\n<p>Ein Klick auf den Link <b>Register <\/b>zeigt dann das Formular aus Bild 7 an. Hier finden Sie die &uuml;blichen Textfelder zur Eingabe der E-Mail-Adresse sowie Textfelder zur zweifachen Eingabe des Kennworts. Hier finden wir bereits einige Mechanismen zur Pr&uuml;fung der Validit&auml;t des Kennworts.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_133_007.png\" alt=\"Registrieren eines neuen Benutzers\" width=\"549,6265\" height=\"406,9755\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Registrieren eines neuen Benutzers<\/span><\/b><\/p>\n<p>Zum Beispiel meckert das Formular, wenn Sie ein Kennwort eingeben, das weniger als sechs Zeichen enth&auml;lt oder wenn die beiden Kennw&ouml;rter nicht &uuml;bereinstimmen.<\/p>\n<p>Weitere Validierungsmeldungen treten erst nach dem Best&auml;tigen der Eingabe &uuml;ber die Schaltfl&auml;che <b>Register <\/b>auf &#8211; zum Beispiel, wenn das Kennwort nicht mindestens ein nicht alphanumerisches Zeichen enth&auml;lt oder wenn das Kennwort keinen Gro&szlig;buchstaben aufweist (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_133_008.png\" alt=\"Fehlgeschlagene Registrierung\" width=\"499,6607\" height=\"258,7301\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Fehlgeschlagene Registrierung<\/span><\/b><\/p>\n<h2>Fehler beim Registrieren ohne Datenbank<\/h2>\n<p>Wenn wir es schlie&szlig;lich geschafft haben, eine g&uuml;ltige E-Mail-Adresse und zwei den Anforderungen entsprechende und &uuml;bereinstimmende Kennw&ouml;rter einzugeben, folgt leider noch eine Fehlermeldung (siehe Bild 9). Diese weist uns darauf hin, dass eine Datenbank mit einem recht kryptischen Namen nicht ge&ouml;ffnet werden konnte. Zum Gl&uuml;ck liefert die Meldung auch gleich noch einen Hinweis, wie wir die fehlende Datenbank bereitstellen k&ouml;nnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_133_009.png\" alt=\"Fehler nach dem Absenden der Registrierung\" width=\"499,6607\" height=\"293,6937\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Fehler nach dem Absenden der Registrierung<\/span><\/b><\/p>\n<h2>Verbindungszeichenfolge anpassen und Datenbank erstellen<\/h2>\n<p>Dies holen wir nun nach, allerdings erst nach dem Anpassen der Verbindungszeichenfolge. Diese enth&auml;lt n&auml;mlich auch den Namen der zu verwendenden Datenbank. Die Verbindungszeichenfolge finden wir in der Datei <b>appsettings.json<\/b>, die aktuell wie in Bild 10 aussieht. Hier k&ouml;nnen wir, bevor die Datenbank tats&auml;chlich erstellen, noch den Namen der Datenbank auf eine eing&auml;ngigere Bezeichnung einstellen, zum Beispiel <b>DbAuth<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_133_010.png\" alt=\"&Auml;ndern des Datenbanknamens in der Verbindungszeichenfolge\" width=\"699,525\" height=\"187,9973\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: &Auml;ndern des Datenbanknamens in der Verbindungszeichenfolge<\/span><\/b><\/p>\n<p>Danach erstellen wir die Datenbank. Dazu &ouml;ffnen wir mit dem Men&uuml;-Eintrag <b>Extras|NuGet-Paket-Manager|Paket-Manager-Konsole <\/b>den Bereich <b>Paket-Manager-Konsole<\/b>. Hier geben wir nun schlicht und einfach den Befehl <b>Update-Database <\/b>ein (siehe Bild 11). Dies startet die Erstellung der Datenbank mit dem in der Verbindungszeichenfolge angegebenen Namen <b>DbAuth<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_133_011.png\" alt=\"Starten der Erstellung der Datenbank\" width=\"424,7115\" height=\"143,5645\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Starten der Erstellung der Datenbank<\/span><\/b><\/p>\n<p>Nun wollen wir uns vergewissern, ob die Datenbank angelegt wurde und vor allem wie die Tabellen der Datenbank aussehen. Dazu starten wir mit <b>Ansicht|SQL Server-Objekt-Explorer <\/b>die gleichnamige Ansicht in Visual Studio 2017. &Ouml;ffnen wir hier die Eintr&auml;ge <b>DbAuth <\/b>und darunter Tabellen, sehen wir, dass die Datenbank nicht nur angelegt wurde, sondern auch noch einige Tabellen enth&auml;lt. Diese hei&szlig;en etwa <b>AspNetUsers <\/b>oder <b>AspNetUserTokens<\/b> (siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_133_012.png\" alt=\"Die neue Datenbank DbAuth\" width=\"424,7115\" height=\"395,5942\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Die neue Datenbank DbAuth<\/span><\/b><\/p>\n<h2>Neuer Registrierungsversuch<\/h2>\n<p>Damit k&ouml;nnen wir nun erneut probieren, einen Benutzer zu registrieren. Dazu starten wir die zwischenzeitlich beendete Webanwendung erneut und klicken im nun erscheinenden Browser-Fenster auf den Link <b>Register<\/b>.<\/p>\n<p>Diesmal gelingt die Registrierung! Nach dem Mausklick auf die Schaltfl&auml;che <b>Register <\/b>wird die Seite aktualisiert und zeigt im oberen Bereich den Eintrag <b>Hello andre@minhorst.com! <\/b>an. Ein Klick auf diesen Eintrag liefert die Profil-Informationen zum neu erstellten Benutzerkonto (siehe Bild 13).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_133_013.png\" alt=\"Die Registrierung hat funktioniert!\" width=\"424,7115\" height=\"325,1864\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Die Registrierung hat funktioniert!<\/span><\/b><\/p>\n<p>Wenn wir uns nun mit einem Klick auf den Link <b>Log out <\/b>abmelden, k&ouml;nnen wir uns anschlie&szlig;end per Klick auf <b>Log in <\/b>erneut anmelden.<\/p>\n<p>Ein Blick in die Tabelle <b>dbo.AspNetUsers<\/b>, die wir mit dem Kontextmen&uuml;-Eintrag <b>Daten anzeigen <\/b>des Elements <b>Datenbanken|DbAuth|Tabellen|dbo.AspNetUsers <\/b>&ouml;ffnen, zeigt einen neuen Datensatz mit der von uns angegebenen E-Mail-Adresse (siehe Bild 14).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/pic_133_014.png\" alt=\"Gespeicherter Benutzer-Datensatz\" width=\"499,6607\" height=\"178,5014\" \/><\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000133\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000133?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000133\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"9fac6dd15a\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In weiteren Artikeln dieser Ausgabe haben wir uns mit ASP.NET Core und den Razor Pages besch&auml;ftigt. Der vorliegende Artikel zeigt, wie Sie beim Erstellen eines neuen Projekts automatisch die Elemente f&uuml;r eine Benutzerverwaltung zum Projekt hinzuf&uuml;gen k&ouml;nnen. Damit werden automatisch etwa die notwendigen Datenbanktabellen angelegt und Elemente f&uuml;r die Anmeldung und die Registrierung hinzugef&uuml;gt.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022018,662018,44000018,44000025,44000017],"tags":[],"yst_prominent_words":[],"class_list":["post-55000133","post","type-post","status-publish","format-standard","hentry","category-66022018","category-662018","category-ASPNET_Core","category-VBAProgrammierung","category-WebApps_Razor_Pages"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000133","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000133"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000133\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000133"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000133"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000133"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000133"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}