Интеграция Facebook и членства в asp.net - PullRequest
2 голосов
/ 03 сентября 2011

Я хочу разрешить пользователям регистрироваться на моем сайте через Facebook.Я уже использую JS SDK на стороне клиента для аутентификации и авторизации, а также C # sdk на стороне сервера, чтобы получить всю информацию, необходимую для заполнения профиля пользователя.Моя проблема заключается в том, что я приказываю пользователю войти в систему со своей учетной записью Facebook, мне нужно создать имя пользователя и пароль для него в своем поставщике членства.Я уже решил, что буду использовать электронную почту Facebook в качестве имени пользователя, но что я могу сделать с паролем?Как я могу позже аутентифицировать его?

Спасибо!

Редактировать: Что я на самом деле спрашиваю: как только пользователь проходит аутентификацию через Facebook в первый раз, и у меня естьвсю его информацию, как бы я пошел о том, чтобы отобразить эту информацию для пользователя членства (с точки зрения имени пользователя и пароля) и как я бы о том, чтобы снова войти в него (отправив ему cookie-файл в ответе) в следующий раз, когда он захочетвойдите под своим уже созданным пользователем.Я знаю, что мне нужно каждый раз проходить аутентификацию через Facebook, но я обдумываю, как мне поступить со стороной членства в asp.net, а не со стороной Facebook.Извините, если мне было неясно раньше:)

Ответы [ 2 ]

7 голосов
/ 03 сентября 2011

Facebook использует OAuth 2.0 .Единственный способ аутентификации пользователя - это отправить его на страницу входа в Facebook и перенаправить обратно, используя его реализацию OAuth.По сути, это дает вам ограниченное время для конкретного пользователя access_token.

Это не совсем подходит для MembershipProviders, хотя можно запросить разрешение offline_access , которое позволяет в любое время выполнять авторизованные запросы от имени пользователя.Пользователь должен согласиться с этим.Условия использования Facebook таковы, что вы не можете запретить пользователю доступ к вашему сайту за то, что он не согласен с расширенными разрешениями, поэтому это снова нарушает модель.

Я не говорю, что это невозможно, просто это не кажетсяСтоит усилий.Вам было бы лучше, просто используя части проверки подлинности форм без членства.Настройка файла cookie для проверки подлинности и проверка подлинности для файла cookie для проверки подлинности на основе facebook access_token.

Для проверки подлинности с помощью Facebook см. Библиотеки OAuth с открытым исходным кодом .NET.Я также написал статью об интеграции с Facebook, в которой показаны некоторые методы (и мнения) интеграции здесь .

Обновление на основе измененного вами вопроса:

Используйте файл cookie для проверки подлинности с помощью форм, чтобы сохранить уникальный идентификатор по вашему выбору (например, имя пользователя Facebook).Вы также можете сохранить текущий access_token в куки.

if (OAuth.ValidateUser(username, user_access_token))
{  
  // store the user access token to make it available on each request
  string userData = user_access_token;

  FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
    1,                                     // ticket version
    username,                              // authenticated username
    DateTime.Now,                          // issueDate
    DateTime.Now.AddMinutes(30),           // expiryDate
    isPersistent,                          // true to persist across browser sessions
    userData,                              // can be used to store additional user data
    FormsAuthentication.FormsCookiePath);  // the path for the cookie

  // Encrypt the ticket using the machine key
  string encryptedTicket = FormsAuthentication.Encrypt(ticket);

  // Add the cookie to the request to save it
  Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket));

  // Your redirect logic
  Response.Redirect(FormsAuthentication.GetRedirectUrl(username, isPersistent));
}

Затем переопределите запрос на проверку подлинности для чтения файла cookie и получения сведений о пользователе.

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    HttpCookie authCookie = Request.Cookie[FormsAuthentication.FormsCookieName];
    if(authCookie != null)
    {
        //Extract the forms authentication cookie
        FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);

        // If caching roles in userData field then extract
        string user_access_token = authTicket.UserData;

        // Create the IIdentity instance, maybe use a custom one
        // possibly retrieve extra data from database or whatever here
        IIdentity id = new FacebookIdentity( authTicket, user_access_token );

        // Create the IPrinciple instance
        IPrincipal principal = new GenericPrincipal(id, new string[]{});

        // Set the context user 
        Context.User = principal;
    }
}

Затем в вашем коде для каждого запроса:

var username = Context.User.Identity.Username;
// implement as an extension method on IIdentity which types to
// FacebookIdentity to get user_access_token
var user_access_token = Context.User.Identity.Access_Token;
1 голос
/ 03 сентября 2011

1 вариант: вы должны сгенерировать пароль и отправить его пользователю по электронной почте, например:

Добро пожаловать на мой superwebsite.com, логин: foo@foo.com пароль: dhyfd46

Затем, если вы видите, что пароль является оригинальным (сгенерированным), попросите пользователя изменить его на другой.

2-й вариант: вы никогда не будете использовать пароль, для вас учетная запись является кортежем (facebookID, по электронной почте) (вы получите его из Api facebook) и, если он будет соответствовать этому (пользователь нажмет ом 'login with facebook', вы сможете создать сеанс пользователя

После редактирования:

Почему бы не использовать кортеж (userId, facebookId) и если у вас есть fb Id, вы знаете userId?

...