我喜欢使用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按钮登录或输入他们的电子邮件和密码。
的问题
- 我有时会从fb收到用于用户电子邮件的null
;如果电子邮件可以为空,我不能用它来成为会员用户
- 这是使用memership和fb的好方法吗?
答案 0 :(得分:1)
3)将用户临时密码发送到电子邮件
我计划使用来自fb的电子邮件作为用户名,以便用户可以使用fb按钮登录或输入他们的电子邮件和密码。
我不会给他们发密码。为什么,这只是通过不安全的电子邮件发送的另一条敏感信息。
相反,如果他们使用Facebook登录我们的网站,我会给他们设置密码的工具。如果他们选择这样做,他们也可以使用他们的用户名和密码登录 - 如果没有,他们仍然可以通过Facebook登录。
我刚检查过我们的数据库 - 看起来几乎只有那些在我们网站上使用FB登录的用户和设置了密码的用户,其帐户在我们实施之前就已存在FB登录。在通过FB登录时,创建帐户中,似乎只有少数设置了密码。他们为什么要这样?为方便起见,他们选择使用FB登录注册帐户 - 为什么现在通过设置另一个想要记住的密码来减损...?
我有时会从fb收到用户电子邮件的空值;如果电子邮件可以为空,我不能使用它来成为会员用户。
我听说这个电子邮件是空的问题,但我自己还没有遇到过。显然,这源于电子邮件地址不是强制创建FB帐户的时间,您也可以使用您的电话号码。
但在这种情况下,您仍然拥有自己的用户名,因此您可以将用户名 @ facebook.com替换为丢失的电子邮件地址 - Facebook最近将其设置为每个用户现在拥有此电子邮件地址。
这是使用memership和fb的好方法吗?
我在网站上的表现几乎相同。如果有人通过FB登录,我检查数据库是否已经有FB用户ID和我们系统中的用户帐户之间的连接;如果是这样,我会记录该用户帐户,如果没有,我会创建一个新帐户。工作正常。
答案 1 :(得分:0)
我是这样做的(也许不是最好的方法,但它有效):
2.添加另一个表格,我将用户链接到普通ID而不是Guids,所以当有人想要查看用户个人资料时,我不必在网址中添加guid,我也有字段DisplayName,因此多个用户可以具有相同的DisplayName
使用和OpenID库进行C#
[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登录。