我们通过使用用户的凭据调用 web 服务并返回包含用户 ID 的 WCF 结构,即“LogonTicket”来覆盖 MVC3 应用程序中的基本身份验证。此 LogonTicket 用于“为对 Web 服务的每次调用验证用户。
现在,我们通过替换 Web.config 中的 defaultProvider 来覆盖。我们在这个被覆盖的提供者中所做的就是覆盖 ValidateUser() 函数。这就是我们使用他们的凭据调用 Web 服务并返回“LogonTicket”的地方。
这是 AccountController 中的 LogOn() 函数,本质上是模板中的基本代码:
public ActionResult LogOn(LogOnModel model)
{
string ReturnUrl = "";
if (HttpContext.Request.UrlReferrer.Query.Length > 11)
{
ReturnUrl = Uri.UnescapeDataString(HttpContext.Request.UrlReferrer.Query.Substring(11));
}
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(ReturnUrl) && ReturnUrl.Length > 1 && ReturnUrl.StartsWith("/")
&& !ReturnUrl.StartsWith("//") && !ReturnUrl.StartsWith("/\\"))
{
return Redirect(ReturnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
ViewBag.MainWebsite = MainWebsite;
return View(model);
}
这是我们新的默认提供程序中重写的 ValidateUser() 函数:
public override bool ValidateUser(string username, string password)
{
MyServiceClient mps = new MyServiceClient();
string sha1password = HashCode(password);
LogonInfo logonInfo = mps.GetLogonTicket(username, sha1password);
if (logonInfo.LogonTicket != "" && logonInfo.LogonTicket != "0")
{
// Authenticated so set session variables
HttpContext.Current.Session["LogonTicket"] = logonInfo.LogonTicket;
HttpContext.Current.Session["ParticipantID"] = logonInfo.ParticipantID;
return true;
}
else
{
return false;
}
}
我不确定如何结合使用两者,所以我的问题是:
- 如何实现 OpenID 和 Facebook 登录并保留当前的身份验证方法?
- 我们如何将 OpenID 用户与我们当前的用户 DB 值“映射”?我们必须知道这样我们才能检索他们的信息。我知道我们可以检索他们的电子邮件地址,但如果他们的 OpenID 电子邮件与他们在我们网站上用于记录的电子邮件不同怎么办?
- 是否有任何示例说明如何在任何地方执行此操作?
谢谢你看我的问题。