Ich versuche, das MVC-Muster zu verstehen, und ich habe die allgemeine Vorstellung, dass das Model dafür verantwortlich ist, den Zustand zu erhalten, die Ansicht dafür verantwortlich ist, das Model darzustellen und der Controller dafür verantwortlich ist, das Model zu modifizieren und die entsprechenden Ansichten aufzurufen. Ich wollte versuchen, eine einfache ASP.NET MVC-Loginseite zu implementieren, die OpenID verwendet, um ein Verständnis dafür zu bekommen, wie das alles funktioniert.
Ich habe DotNetOpenAuth-3.4.6 heruntergeladen und mir die Beispiele angesehen, insbesondere deren MVC-Beispiel. Leider hat das Beispiel tatsächlich kein Modell, sondern nur einen Controller:
namespace OpenIdRelyingPartyMvc.Controllers
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using DotNetOpenAuth.Messaging;
using DotNetOpenAuth.OpenId;
using DotNetOpenAuth.OpenId.RelyingParty;
public class UserController : Controller
{
private static OpenIdRelyingParty openid = new OpenIdRelyingParty();
public ActionResult Index()
{
if (!User.Identity.IsAuthenticated)
{
Response.Redirect("~/User/Login?ReturnUrl=Index");
}
return View("Index");
}
public ActionResult Logout()
{
FormsAuthentication.SignOut();
return Redirect("~/Home");
}
public ActionResult Login()
{
// Stage 1: display login form to user
return View("Login");
}
[ValidateInput(false)]
public ActionResult Authenticate(string returnUrl)
{
var response = openid.GetResponse();
if (response == null)
{
// Stage 2: user submitting Identifier
Identifier id;
if (Identifier.TryParse(Request.Form["openid_identifier"], out id))
{
try
{
return openid.CreateRequest(Request.Form["openid_identifier"]).RedirectingResponse.AsActionResult();
}
catch (ProtocolException ex)
{
ViewData["Message"] = ex.Message;
return View("Login");
}
}
else
{
ViewData["Message"] = "Invalid identifier";
return View("Login");
}
}
else
{
// Stage 3: OpenID Provider sending assertion response
switch (response.Status)
{
case AuthenticationStatus.Authenticated:
Session["FriendlyIdentifier"] = response.FriendlyIdentifierForDisplay;
FormsAuthentication.SetAuthCookie(response.ClaimedIdentifier, false);
if (!string.IsNullOrEmpty(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
case AuthenticationStatus.Canceled:
ViewData["Message"] = "Canceled at provider";
return View("Login");
case AuthenticationStatus.Failed:
ViewData["Message"] = response.Exception.Message;
return View("Login");
}
}
return new EmptyResult();
}
}
}
Vielleicht ist das Beispiel zu einfach, um tatsächlich ein Modell einzubeziehen, da alle Zustandsinformationen im Cookie enthalten sind. Daraufhin habe ich eine einfache Datenbank implementiert, die eine einzige Benutzertabelle hat:
Users
+ user_id
+ open_id
+ last_login
Ich nehme an, dass ich ein LoginModel
benötigen würde:
public class LogInModel
{
[Required]
[DisplayName("OpenID")]
public string OpenID { get; set; }
}
Ein DisplayModel
:
public class DisplayModel
{
[DisplayName("User ID")]
public string UserID{ get; set; }
[DisplayName("OpenID")]
public string OpenID { get; set; }
[DisplayName("Last Login")]
public DateTime LastLogin{ get; set; }
}
Zusätzlich könnte ich ein ModifyModel
benötigen, aber das DisplayModel
kann wiederverwendet und möglicherweise in UserModel
umbenannt werden (um die Verwendung des Modells ordnungsgemäß widerzuspiegeln).
Jetzt habe ich mehrere Fragen:
- Ist der Controller dafür verantwortlich, die Benutzereingabe zu überprüfen, oder wird dies durchgeführt, wenn die Eingabe an das Modell übergeben wird (d.h. Aufruf von
Identifier.TryParse
auf demopenid_identifier
)? - Ich möchte dem Benutzer erlauben, sich einzuloggen, ihre Informationen zu ändern (z.B. die user_id) und ihre Informationen anzuzeigen (z.B. user_id, open_id und last_login). Wie viele Modelle benötige ich (
ModifyModel
,DisplayModel
undLogInModel
)? - Was ist die Lebensdauer eines Modells? Existiert das Modell statisch an einem Ort oder wird es einfach vom Controller erstellt und an die Ansicht übergeben?
- Wäre es besser, die Datenbank als Modell hinzuzufügen, anstatt die obigen Modelle zu erstellen?