Как правильно использовать проверку подлинности форм наряду с проверкой подлинности Facebook / Other в ASP.NET MVC? - PullRequest
2 голосов
/ 10 января 2012

Я создаю приложение в ASP.NET MVC 3, в котором я реализовал проверку подлинности с помощью форм.

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

Я использую C # Facebook SDK

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

Что касается моей реализации на Facebook, я запрашиваю у пользователя разрешение на не истекающий токен авторизации, который я буду хранить в своей базе данных..

Ответы [ 2 ]

2 голосов
/ 10 января 2012

Для этого вам нужно будет сделать что-то вроде этого

  1. Создать пользовательский класс (CurrentIdentity), который реализует IIdentity .Переопределите .ToString () для этого класса, чтобы у вас было какое-то сериализованное состояние объекта.Я должен был использовать "|"Seperator.Эта строка будет сохранена в зашифрованном файле cookie.
  2. Создать файл cookie сеанса

    public static HttpCookie AuthCookie(CurrentIdentity identity) {
       //Create the Authticket, store it in Cookie and redirect user back
       FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,
                          identity.Name, DateTime.Now, DateTime.Now.AddHours(3), true, identity.ToString(), FormsAuthentication.FormsCookiePath);
       string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
       HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
       authCookie.Expires = authTicket.Expiration;
       return authCookie;
    }
    
  3. Добавить этот файл cookie в ответ.

    HttpResponse res = HttpContext.Current.Response;
    res.Cookies.Add(Helper.AuthCookie(identity));
    res.Redirect(FormsAuthentication.GetRedirectUrl(identity.Name, true));
    res.End();
    
  4. Теперь в Gloabl.asax, внутри * Application_AuthenticateRequest * прочитайте этот файл cookie и заполните объект CurrentIdentity, что-то вроде этого.

    if (Request.IsAuthenticated == true) {
            // Extract the forms authentication cookie
            string cookieName = FormsAuthentication.FormsCookieName;
            HttpCookie authCookie = Context.Request.Cookies[cookieName];
    
            if (null == authCookie) {
                // There is no authentication cookie.
                return;
            }
            FormsAuthenticationTicket authTicket = null;
            try {
                authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            } catch (Exception) {
                // Log exception details (omitted for simplicity)
                return;
            }
    
            if (null == authTicket) {
                // Cookie failed to decrypt.
                return;
            }
            // When the ticket was created, the UserData property was assigned a
            // pipe delimited string of role names.
            string[] userInfo = authTicket.UserData.Split('|');
    
            // Create an Identity object
            FormsIdentity id = new FormsIdentity(authTicket);
            //Populate CurrentIdentity, from Serialized string
            CurrentIdentity currentIdentity = new CurrentIdentity(userInfo[0], userInfo[1], userInfo[2]);
            System.Security.Principal.GenericPrincipal principal = new System.Security.Principal.GenericPrincipal(currentIdentity, userInfo);
            Context.User = principal;
    }
    

Это должно решить вашупроблема.Я реализовал аналогичную вещь на веб-сайте моей компании .

0 голосов
/ 10 января 2012

объединить аутентификацию facebook с вашими формами аутентификации. При входе пользователя с использованием форм auth вы создаете FormsAuthenticationTicket, при входе с Facebook также создаете FormsAuthenticationTicket

...