gpt4 book ai didi

asp.net-mvc - 在具有覆盖身份验证方法的 MVC3 应用程序中使用 OpenID/OpenAuth

转载 作者:行者123 更新时间:2023-12-01 12:50:05 25 4
gpt4 key购买 nike

我们通过使用用户凭据调用 Web 服务并返回包含用户 ID(“LogonTicket”)的 WCF 结构来覆盖 MVC3 应用程序中的基本身份验证。此 LogonTicket 用于“对每次调用网络服务的用户进行身份验证。

现在,我们通过替换 Web.config 中的 defaultProvider 来覆盖。我们在这个被覆盖的提供者中所做的就是覆盖 ValidateUser() 函数。那就是我们用他们的凭据调用网络服务并返回的地方“登录票”。

这是我们 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;
}
}

我不太确定如何结合使用这两者,所以我的问题是:

  1. 如何实现 OpenID 和 Facebook 登录并保持当前的身份验证方法?
  2. 我们如何将 OpenID 用户“映射”到我们当前的用户数据库值?我们必须知道,这样我们才能检索他们的信息。 我知道我们可以检索他们的电子邮件地址,但如果他们的 OpenID 电子邮件与他们在我们网站上用于记录的电子邮件不同怎么办?
  3. 是否有关于如何在任何地方执行此操作的示例?

感谢您查看我的问题。

最佳答案

我完成了一个需要多种登录可能性的项目(自定义帐户、Google 和 Facebook)

最后,您使用 ASP.NET 进行的身份验证完全取决于您的配置。 (在您的情况下,它是 FormsAuthentication)这意味着 FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 基本上确定了与您的用户有关的所有内容,并且您设置它的位置不受限制。

您现在的实现与我们开始时基本相同,使用 MembershipProvider 来处理您自己的自定义帐户。您现在只需要扩展以方便openIds。您必须使用针对每种登录类型的各种操作来扩展您的 Controller(现在您可以添加 ActionResult LogOn(),例如:ActionResult LogOnOpenId( ))。在该方法中,您基本上调用了相同的代码,但您调用的是 OpenId 服务,而不是 Membership.ValidateUser(model.UserName, model.Password)

我在下面提供了一个使用 dotnetopenauth 的 google 实现示例。服务方法使用 formsService.SignIn(userId.Value.ToString(), false); 基本上调用 FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); (我们只在那里做一些关于 SecurityPrincipal 的自定义行为,但这不会影响您的身份验证过程)。您还可以看到我们在收到新用户时创建了一个新帐户。为了解决您的问题第 2 部分,我们实现了一个配置文件,如果您可以提供另一个登录名,则可以合并该配置文件。这允许我们的用户保持他们的帐户合并并使用他们喜欢的任何登录方法。

有关多点登录的示例,我将引用 Tomas 的回答,他引用 StackExchange 作为一个很好的例子。另外,我建议您安装 MVC4 和 VS2012,然后执行"file">“新建项目”。 MVC 的最新默认模板包括 openid 实现以及自定义登录!

google openid 实现示例:

Controller 方法:

    public virtual ActionResult LoginGoogle(string returnUrl, string runAction)
{
using (var openId = new OpenIdRelyingParty())
{
IAuthenticationResponse response = openId.GetResponse();

// If we have no response, start
if (response == null)
{
// Create a request and redirect the user
IAuthenticationRequest req = openId.CreateRequest(WellKnownProviders.Google);
var fetch = new FetchRequest();
fetch.Attributes.AddRequired(WellKnownAttributes.Name.First);
fetch.Attributes.AddRequired(WellKnownAttributes.Name.Last);
fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
fetch.Attributes.AddRequired(WellKnownAttributes.Preferences.Language);
req.AddExtension(fetch);

req.RedirectToProvider();

return null;
}

_service.ConnectViaGoogle(response, TempData);
}

服务方式:

    public void ConnectViaGoogle(IAuthenticationResponse response, TempDataDictionary tempData)
{
// We got a response - check it's valid and that it's me
if (response.Status == AuthenticationStatus.Authenticated)
{
var claim = response.GetExtension<FetchResponse>();
Identifier googleUserId = response.ClaimedIdentifier;
string email = string.Empty;
string firstName = string.Empty;
string lastName = string.Empty;
string language = string.Empty;

if (claim != null)
{
email = claim.GetAttributeValue(WellKnownAttributes.Contact.Email);
firstName = claim.GetAttributeValue(WellKnownAttributes.Name.First);
lastName = claim.GetAttributeValue(WellKnownAttributes.Name.Last);
language = claim.GetAttributeValue(WellKnownAttributes.Preferences.Language);
}

//Search User with google UserId
int? userId = _userBL.GetUserIdByGoogleSingleSignOnId(googleUserId);

//if not exists -> Create
if (!userId.HasValue)
{
_userBL.CreateGoogleUser(
googleUserId,
firstName,
lastName,
email,
language,
DBConstants.UserStatus.DefaultStatusId,
out userId);
}

if (userId.HasValue)
{
_userBL.UpdateLastLogon(userId.Value);
var formsService = new FormsAuthenticationService();
formsService.SignIn(userId.Value.ToString(), false);
AfterLoginActions(tempData);
}
}
}

有任何问题或意见吗?我很乐意听到他们的声音。

关于asp.net-mvc - 在具有覆盖身份验证方法的 MVC3 应用程序中使用 OpenID/OpenAuth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13145666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com