Ich entwickle eine ASP.NET MVC 5-Anwendung. Ich habe eine vorhandene Datenbank, aus der ich mein ADO.NET Entity Data Model erstellt habe. Ich habe eine Tabelle in dieser DB, die Spalte "Benutzername" und "Passwort" enthält, und ich möchte sie verwenden, um Authentifizierung und Autorisierung in meiner Webapp zu implementieren; Ich kann keine andere Datenbank oder Tabelle oder Spalte erstellen und kann die standardmäßige Identitätsauthentifizierung aufgrund der Kundenanforderungen nicht verwenden. Ich brauche keine Anmeldung, Passwort ändern oder andere Sachen: nur mit Passwort und Benutzernamen anmelden. Wie kann ich das tun?So implementieren Sie benutzerdefinierte Authentifizierung in ASP.NET MVC 5
59
A
Antwort
112
Ja, Sie können. Authentifizierungs- und Autorisierungsteile arbeiten unabhängig voneinander. Wenn Sie einen eigenen Authentifizierungsdienst haben, können Sie einfach OWINs Berechtigungsteil verwenden. Betrachten Sie bereits eine UserManager
, die username
und password
validiert. Daher können Sie den folgenden Code in Ihrem Beitrag zurück meldet sich schreiben:
[HttpPost]
public ActionResult Login(string username, string password)
{
if (new UserManager().IsValid(username, password))
{
var ident = new ClaimsIdentity(
new[] {
// adding following 2 claim just for supporting default antiforgery provider
new Claim(ClaimTypes.NameIdentifier, username),
new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"),
new Claim(ClaimTypes.Name,username),
// optionally you could add roles if any
new Claim(ClaimTypes.Role, "RoleName"),
new Claim(ClaimTypes.Role, "AnotherRole"),
},
DefaultAuthenticationTypes.ApplicationCookie);
HttpContext.GetOwinContext().Authentication.SignIn(
new AuthenticationProperties { IsPersistent = false }, ident);
return RedirectToAction("MyAction"); // auth succeed
}
// invalid username or password
ModelState.AddModelError("", "invalid username or password");
return View();
}
Und Ihre Benutzer-Manager so etwas wie das sein kann:
class UserManager
{
public bool IsValid(string username, string password)
{
using(var db=new MyDbContext()) // use your DbConext
{
// for the sake of simplicity I use plain text passwords
// in real world hashing and salting techniques must be implemented
return db.Users.Any(u=>u.Username==username
&& u.Password==password);
}
}
}
Am Ende können Sie Ihre Aktionen oder Controller schützen Hinzufügen eines Authorize
Attributs.
[Authorize]
public ActionResult MySecretAction()
{
// all authorized users can use this method
// we have accessed current user principal by calling also
// HttpContext.User
}
[Authorize(Roles="Admin")]
public ActionResult MySecretAction()
{
// just Admin users have access to this method
}
Es tut mir leid, ich bin ein Neuling mit Authentifizierung. Wo soll ich diesen Code benutzen? Wie kann ich MVC anweisen, Benutzernamen und Passwortfelder aus meiner EF-Klasse zu übernehmen? –
Ich habe gerade meinen Beitrag aktualisiert, um Ihre Fragen zu beantworten. –
Danke! Es funktioniert super! –