ユーザーの資格情報を使用して Web サービスを呼び出し、ユーザーの ID である "LogonTicket" を含む WCF 構造を返すことにより、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;
}
}
2つの使用を組み合わせる方法がよくわからないので、私の質問は次のとおりです。
- OpenID と Facebook のログインを実装し、現在の認証方法を維持するにはどうすればよいですか?
- OpenID ユーザーを現在のユーザー DB 値にどのように「マップ」できますか? 彼らの情報を取得できるように、知っておく必要があります。メール アドレスを取得できることはわかっていますが、OpenID メールがサイトで記録に使用しているメールと異なる場合はどうなりますか?
- これを行う方法の例はどこにありますか?
私の質問を見てくれてありがとう。