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;