Beschränken Sie den Zugriff, bis der Benutzer eine E-Mail-link bestätigt hat
Ich bin, die um die Identität.Muster Beispiel und fand heraus, dass Benutzer weiterhin anmelden ohne einen Klick auf die E-Mail-Bestätigung nach der Anmeldung. Gibt es ein flag zum aktivieren zum einschränken der Benutzer von der Anmeldung, bis er/Sie klickt auf den bestätigen-link in seiner E-Mail? Oder irgendwelche extra-code, den ich brauche, um zu schreiben, um dies zu verhindern?
EDIT: Hinzugefügt wurde die Login-action-code aus den Proben
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
//This doen't count login failures towards lockout only two factor authentication
//To enable password failures to trigger lockout, change to shouldLockout: true
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
- Was bedeutet der Login-action Aussehen mit der Probe? Vielleicht brauchen Sie, um zusätzliche Logik, um zu überprüfen, dass die "Bestätigung fahne" gegen den account eingestellt ist?
- Können Sie uns den link zum Beispiel? Ich hatte einen Blick auf asp.net/identity/overview/features-api/..., und das einzige, was verhindert wird, für eine unbestätigte Konto ändern des Kennworts.
- Zunächst müssen Sie ein flag in der Datenbank, so dass, wenn jeder Benutzer Registrieren, die für die erste Zeit, setzen Sie das flag auf "False" und ändern Sie das flag auf 'True', wenn ein Benutzer klickt auf die Bestätigungs-URL. Nun, wenn der Benutzer versucht, an login-check für das Flag, ob seine 'True' oder nicht. Wenn seine 'Wahre' der Benutzer geklickt hat, die einen Bestätigungslink, den Sie sonst nicht.
- diese sind nicht die Antwort !! warum gibt es ein nutzlos SignInStatus.RequiresVerification!!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, dass emailConfirmation, fügen Sie einfach eine zusätzliche Kontrolle, wie Sie dies, bevor Sie versuchen, die passwordSignIn:
Wie JT ich denke, Sie sollten überprüfen, um sicherzustellen, Sie werden authentifiziert, bevor Sie wissen zu lassen Sie haben, um zu bestätigen, die E-Mail-Adresse. Sonst könnte jemand mit Ihrem system zu sehen, wenn die E-Mail existiert in Ihrem system. Also legte ich Hao code nach signin.Erfolg
Aus der Basis von Hao ' s Antwort habe ich mich dazu entschlossen meine eigene "SignInManager.SignInAsync" - Methode zum verarbeiten der E-Mail-Bestätigung vor dem login. Nicht sicher, ob dies wird helfen, jemand anderes (oder wenn es gibt ein besserer Weg, dies zu tun), aber dachte, ich würde Aktie. Eine Sache zu beachten ist, dass die Funktionalität ein wenig anders aus Hao ' s Vorschlag. Um die "RequiresValidation" zurückgegeben, würde der Benutzer müssen zuerst einen gültigen Benutzernamen und ein Passwort.
Update 1: Nach einigem nachdenken, glaube ich nicht, das ist das richtige für 2FA. Auf der Grundlage von anderen Website-2FA-Implementierung (Mandrill für einen) Sie haben die Nutzer geben Ihre Benutzer - \ - pass, dann zusätzlich geben Sie einen passcode in Ihr Telefon, bevor Sie berechtigt sind, die Seite zu betreten. Dies ist anders als nur die überprüfung der E-Mail-Konto, bevor der Benutzer\pass darf verwendet werden. Ich mag meine Implementierung für die E-Mail-Bestätigung besser, da es nicht preiszugeben, die Benutzer-Konten, aber seine nicht 2FA.
Update 2: Entfernt den check für GetTwoFactorEnabledAsync(). Der obige code ist für die Verhinderung anmelden bis E-Mail-Bestätigung empfangen wird, und hat nichts zu tun mit 2FA (die Sie eigentlich nicht tun können, 2FA mit der oben genannten Methode, da Sie ein token ist nie gesendet oder überprüft werden, bevor der Benutzer angemeldet ist).
shouldLockout
parameter... nicht für mich Aussehen wie Ihre Implementierung behandelt...Oder bin ich da falsch? Ich werde Ihre Umsetzung ein Versuch Wert, aber ich bin neugierig, was Sie denken über die Aussperrung Sache..IsEmailConfirmed(...)
vor dem AufrufPasswordSignIn(...)
außer, dass ich überprüfen Sie die Benutzername\Passwort vor der Anzeige des Fehlers, um zu verhindern, dass Menschen auf der Suche für nicht authentifizierte Benutzernamen. Es wäre wahrscheinlich genauso einfach zu überprüfen, nach dem Aufruf PasswordSignIn und sofort Abmelden wenn Sie Ihre E-Mail nicht bestätigt ist.