我喜欢与asp成员合作,我需要在一个网站上的FB整合,所以我不想混淆他们。以下是我的计划:
1) Implement method that get data from user FB account (firstname, lastname, username, email)
2) When I get the data, use asp membership CreateUser() method to make user in database
3) Send user temporary password to email我计划使用来自fb的电子邮件作为用户名,这样用户就可以使用fb按钮登录,或者输入他们的电子邮件和密码。
发行
null;如果电子邮件是空的,那么我就不能用它来使会员成为用户。发布于 2012-07-06 07:38:32
3)发送用户临时密码到电子邮件 我计划使用来自fb的电子邮件作为用户名,这样用户就可以使用fb按钮登录,或者输入他们的电子邮件和密码。
我不会给他们发密码。为什么,这只是通过不安全的电子邮件发送的另一条明智的信息。
相反,如果他们用Facebook登录到我们的网站,我会给他们设置密码。如果他们选择这样做,他们也可以登录他们的用户名和密码-如果没有,他们仍然可以通过Facebook登录。
我刚刚检查了我们的数据库--看起来几乎只有那些在我们的站点上使用了FB登录并且有密码集的用户是那些在我们实现FB登录之前已经存在帐户的用户。在通过FB登录时创建的帐户中,似乎只有少数拥有密码集。他们为什么要这么做?为了方便起见,他们选择使用FB登录注册一个帐户--为什么现在只设置另一个想要被记住的…密码就会损害这个帐户呢??
我有时会收到来自fb的用户电子邮件的null;如果电子邮件可以是null,那么我就不能使用它来使会员成为用户。
我听说过这封电子邮件是零问题,虽然还没有遇到它自己。很明显,这是由于电子邮件地址不是必须创建FB帐户的时候,你也可以使用你的电话号码。
但是在这种情况下,你仍然有他们的用户名,所以你可以用username@facebook.com来代替丢失的电子邮件地址-- Facebook最近设置了它,这样每个用户现在都有了这个电子邮件地址。
这是一个很好的方式使用记忆体和fb?
我在我们的网站上也是这样做的。如果有人通过FB登录,如果我们已经在系统中的FB用户in和用户帐户之间建立了连接,我将检查数据库;如果是的话,我会登录该用户帐户,如果没有,我会创建一个新的帐户。效果很好。
发布于 2012-07-06 08:01:43
下面是我是如何做到的(也许不是最好的方法,但它是有效的):
[AllowAnonymous]
public ActionResult LoginOpenID(string provider, string returnUrl)
{
using (var openid = new OpenIdRelyingParty())
{
var response = openid.GetResponse();
if (response == null)
{
try
{
var request = openid.CreateRequest(provider);
var fetchRequest = new FetchRequest();
fetchRequest.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
fetchRequest.Attributes.AddRequired(WellKnownAttributes.Name.Alias);
fetchRequest.Attributes.AddRequired(WellKnownAttributes.Name.FullName);
request.AddExtension(fetchRequest);
request.AddCallbackArguments("returnUrl", returnUrl);
return request.RedirectingResponse.AsActionResult();
}
catch (ProtocolException pExp)
{
}
catch (WebException Wexp)
{
}
catch (ArgumentException aexp)
{
}
}
else
{
switch (response.Status)
{
case AuthenticationStatus.Authenticated:
var fetch = response.GetExtension<FetchResponse>();
string alias = fetch.GetAttributeValue(WellKnownAttributes.Name.Alias);
string email = fetch.GetAttributeValue(WellKnownAttributes.Contact.Email);
string fullname = fetch.GetAttributeValue(WellKnownAttributes.Name.FullName);
if (string.IsNullOrEmpty(alias))
alias = response.ClaimedIdentifier;
if (alias.Contains("google"))
{
Random random = new Random();
int randomNumber = random.Next(1000000000);
alias = "user" + randomNumber;
}
if (string.IsNullOrEmpty(email))
email = response.ClaimedIdentifier;
//Now see if the user already exists, if not create them
if (email.Contains("gmail.com") && Membership.FindUsersByEmail(email).Count > 0)
{
var cookie = FormsAuthentication.GetAuthCookie(Membership.GetUserNameByEmail(email), true);
Response.AppendCookie(cookie);
}
else if (Membership.GetUser(response.ClaimedIdentifier) == null && Membership.FindUsersByEmail(email).Count == 0)
{
MembershipCreateStatus membershipCreateStatus;
string password = GetRandomString(6, 9);
MembershipUser user = Membership.CreateUser(response.ClaimedIdentifier.ToString(),
password,
email,
"This is an OpenID account. You should log in with your OpenID.",
GetRandomString(5, 7),
true,
out membershipCreateStatus);
if (membershipCreateStatus != MembershipCreateStatus.Success)
{
TempData["message"] = "Unsuccessful creation of Account. " + membershipCreateStatus.ToString();
return RedirectToAction("Login", "Account");
}
if (membershipCreateStatus == MembershipCreateStatus.Success)
{
user.Comment = alias;
Membership.UpdateUser(user);
using (MyContext context = new MyContext())
{
Data.UserShortId userShortId = new Data.UserShortId { Guid = (Guid)user.ProviderUserKey, DisplayName = alias };
context.UserShortIds.InsertOnSubmit(userShortId);
context.SubmitChanges();
}
}
// Use FormsAuthentication to tell ASP.NET that the user is now logged in,
// with the OpenID Claimed Identifier as their username.
var cookie = FormsAuthentication.GetAuthCookie(response.ClaimedIdentifier, true);
Response.AppendCookie(cookie);
}
else
{
var cookie = FormsAuthentication.GetAuthCookie(response.ClaimedIdentifier, true);
Response.AppendCookie(cookie);
}
break;
case AuthenticationStatus.Canceled:
TempData["message"] = "Login was cancelled at the provider";
return RedirectToAction("Login", "Account");
case AuthenticationStatus.Failed:
TempData["message"] = "Login failed using the provided OpenID identifier";
return RedirectToAction("Login", "Account");
}
}
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
}
private static Random random = new Random(46258975);
public static int GetRandomInteger(int min, int max)
{
return random.Next(min, max + 1);
}
public static string GetRandomString(int minLength, int maxLength)
{
int strLength = GetRandomInteger(minLength, maxLength);
StringBuilder builder = new StringBuilder();
char ch;
for (int i = 0; i < strLength; i++)
{
ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
builder.Append(ch);
}
return builder.ToString().ToLower();
}认证时:
@using (Html.BeginForm("LoginOpenId", "Account", FormMethod.Post))
{
@Html.Hidden("returnUrl", Request.QueryString["ReturnUrl"])
<p>Login using:</p>
<input type="submit" class="login-btn facebook" name="provider" value="http://facebook-openid.appspot.com/" />
<input type="submit" class="login-btn google" name="provider" value="https://www.google.com/accounts/o8/id" />
<input type="submit" class="login-btn yahoo" name="provider" value="http://me.yahoo.com/" />
}正如您所看到的,这还没有完成,我使用的是非官方的FB OpenID提供程序,但是您可以编写用OAuth单独处理Fb登录的案例。
https://stackoverflow.com/questions/11353613
复制相似问题