C# 为什么其他机器在已经从一台计算机注册后,不使用Google OAuth返回OAuthWebSecurity.Login()的“true”?
我有一个奇怪的小错误,只有当机器已经从另一台机器注册到我们的站点后,试图通过GoogleOAuth登录时才会发生 我有一个部分CMS,只有我们的员工可以登录一个简单的按钮点击,虽然它是一个非CMS部分的公共网站 关于登录的一切似乎都很好,但是一旦注册,也就是说,我们的数据库中已经有一个现有帐户,用户尝试从另一台计算机登录。IFC ifregistered等同于false,并将用户视为试图注册,而不仅仅是登录,这是由我的代码处理的,它显示一个错误页面,上面写着,该用户已经注册了 有关的逻辑分支:C# 为什么其他机器在已经从一台计算机注册后,不使用Google OAuth返回OAuthWebSecurity.Login()的“true”?,c#,asp.net,oauth,webmatrix,asp.net-webpages,C#,Asp.net,Oauth,Webmatrix,Asp.net Webpages,我有一个奇怪的小错误,只有当机器已经从另一台机器注册到我们的站点后,试图通过GoogleOAuth登录时才会发生 我有一个部分CMS,只有我们的员工可以登录一个简单的按钮点击,虽然它是一个非CMS部分的公共网站 关于登录的一切似乎都很好,但是一旦注册,也就是说,我们的数据库中已经有一个现有帐户,用户尝试从另一台计算机登录。IFC ifregistered等同于false,并将用户视为试图注册,而不仅仅是登录,这是由我的代码处理的,它显示一个错误页面,上面写着,该用户已经注册了 有关的逻辑分支:
bool registered = OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false);
if (registered)
{
Context.RedirectLocal(returnUrl);
return;
}
以下是整个cshtml文件:
@{
WebSecurity.Logout();
string email = "";
string loginData = "";
string providerDisplayName = "";
var errorMessage = "";
var db = Database.Open("Accounts");
var returnUrl = Request.QueryString["ReturnUrl"];
if (returnUrl.IsEmpty())
{
returnUrl = Href("~/CMS Interface/AdminLogin.cshtml");
}
if (IsPost && Request.Form["newAccount"].AsBool())
{
email = Request.Form["userName"];
loginData = Request.Form["loginData"];
string provider = "";
string providerUserId = "";
if (WebSecurity.IsAuthenticated || !OAuthWebSecurity.TryDeserializeProviderUserId(loginData, out provider, out providerUserId))
{
Context.RedirectLocal("~/");
return;
}
providerDisplayName = OAuthWebSecurity.GetOAuthClientData(provider).DisplayName;
db.Execute("INSERT INTO UserProfile (Email, IPAddress) VALUES (@0, @1)", email, Request.UserHostAddress);
Roles.AddUserToRole(email, "Locked");
OAuthWebSecurity.CreateOrUpdateAccount(providerDisplayName, providerUserId, email);
OAuthWebSecurity.Login(provider, providerUserId, createPersistentCookie: false);
Context.RedirectLocal(returnUrl);
return;
}
else
{
var result = OAuthWebSecurity.VerifyAuthentication(Href("~/Account/RegisterService", new { returnUrl }));
if (result.IsSuccessful)
{
bool registered = OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false);
if (registered) //This doesn't equate to true after user is already registered, although it should.
{
Context.RedirectLocal(returnUrl);
return;
}
email = result.UserName;
if (!EmailValidator.IsEmailAdress(email))
{
errorMessage = "The email address supplied was not a valid email address. ";
errorMessage += "Please return to the main page and try again. If the problem ";
errorMessage += "persists, please notify a site administrator for help.<br/><br/>";
errorMessage += "<a class=\"retreatLink\" href=\"/\">Main Page</a>";
}
if (!email.EndsWith("@okmcity.net"))
{
errorMessage = "Your email address was valid, however, it seems that it's ";
errorMessage += "not a \"City of Okmulgee\" email address. Please ensure that ";
errorMessage += "your email address is part of the \"@okmcity.net\" domain.<br/><br/>";
errorMessage += "If you are having trouble changing your email address ";
errorMessage += "try visiting Google's <a href=\"https://mail.google.com\">Gmail</a> ";
errorMessage += "page and logging out. After you have logged out of gmail, revisit ";
errorMessage += "the <a href=\"/\">main page</a> and click the ";
errorMessage += "\"Log-in!\" button again. Then, when prompted by Gmail services, ";
errorMessage += "log back in using a valid \"okmcity.net\" email address.<br/><br/>";
errorMessage += "For more help visit <a href=\"https://support.google.com/mail/answer/8154?hl=en\">";
errorMessage += "Gmail Help</a> for quick steps on how to log-out of your Gmail account.";
}
if (errorMessage == "")
{
email = email.Substring(0, email.IndexOf("@"));
}
var user = db.QuerySingle("SELECT Email FROM UserProfile WHERE LOWER(Email) = LOWER(@0)", email);
if (user != null) //This branch equates to true when user is already registered (as it should, as a failsafe, except that the code should never reach this far down in the first place when a user is registered.
{
errorMessage = "The user " + email + " already exists. You cannot register twice. ";
errorMessage += "Please revisit the <a href=\"/\">main page</a> and click the \"Log-in!\" ";
errorMessage += "button again. If this problem persists, please notify a site administrator ";
errorMessage += "for help.";
}
loginData = OAuthWebSecurity.SerializeProviderUserId(result.Provider, result.ProviderUserId);
providerDisplayName = OAuthWebSecurity.GetOAuthClientData(result.Provider).DisplayName;
}
else
{
Context.RedirectLocal("~/Account/ExternalLoginFailure");
return;
}
}
}
<div class="subWrapper">
<h2>Associate your @providerDisplayName account.</h2>
<form method="post">
<input type="hidden" name="loginData" value="@loginData" />
<fieldset class="regBox">
<legend class="regBox">Registration</legend>
@if (errorMessage == "")
{
<p>
You've successfully authenticated with <strong>@providerDisplayName</strong>. Please
click the "Confirm" button to log-in and finish registering.
</p>
<div>
<span>
<label for="userName">Your User Name:</label>
<input type="text" id="userName" name="userName" readonly="true" value="@email" />
</span>
</div><br/>
<button type="submit" class="loginBtn" name="newAccount" value="true">Confirm</button>
}
else
{
<p class="errorMessage">
@Html.Raw(errorMessage)
</p>
}
</fieldset>
</form>
</div>
但问题是,在原始机器上,一切正常,一旦注册,ifregistered条件等于true
你得原谅我,我对OAuth不太了解。虽然我以前使用过它,但我主要是通过在键入时逐行阅读它来理解它,偶尔也会查找MSDN以获得某些方法的帮助
尽管代码基本相同,但我不得不根据我们的具体需要重新设置默认设置。可能是我把这里搞砸了
在尝试用谷歌搜索之后,我找不到任何相关的东西。另外,我真的不明白这个问题的本质,所以我不知道我是否遗漏了任何对解决这个问题有用的信息。如果是这样,请告诉我
你可能想知道的事情
Google是我们唯一需要的OAuth或openID身份验证
我正在使用Webmatrix C环境的ASP.NET网页中工作。我刚刚看到了完全相同的问题,这是由WebDeploy在部署期间替换数据库连接字符串引起的。出于某种原因,它要求我选择这些字符串,尽管它们已在Web.config中指定。不知何故,我的三个连接字符串只提供了两个值,这意味着其中一个是错误的——一个用于用户帐户。这意味着,当它查找登录者的用户ID时,整个过程都失败了,因为表根本不存在!不知何故,这个错误被抑制了,只返回false。对不起,我已经不再真正研究它了。我不确定我指定连接字符串的方式是否有什么问题,因此WebDeploy只能选择其中的两个。可能是因为上没有完全限定的服务器名,或者可能是因为两个服务器指向同一个服务器。我希望这是一个愚蠢的事情,而不是一个大问题。