private void DoTwitterLogin(HttpContext context, string returnUrl)
        {
            if (TwitterConsumer.IsTwitterConsumerConfigured)
            {
                var token = context.Request["oauth_token"];
                if (string.IsNullOrEmpty(token))
                {
                    var request = TwitterConsumer.StartSignInWithTwitter(false);
                    request.Send();
                }
                else
                {
                    string screenName;
                    int    userId;
                    string accessToken;
                    if (TwitterConsumer.TryFinishSignInWithTwitter(out screenName, out userId, out accessToken))
                    {
                        //Sucess. Get information
                        var info    = TwitterConsumer.GetUserInfo(userId, accessToken);
                        var profile = UniversalProfile.ProfileFromTwitter(info);

                        RedirectToReturnUrl(context, returnUrl, profile);
                    }
                    else
                    {
                        RedirectToReturnUrl(context, returnUrl, UniversalProfile.FromError(new Exception("Login failed")));
                    }
                }
            }
        }
        private void DoFacebookLogin(HttpContext context, string returnUrl)
        {
            var client = new FacebookClient
            {
                ClientIdentifier = ConfigurationManager.AppSettings["facebookAppID"],
                ClientSecret     = ConfigurationManager.AppSettings["facebookAppSecret"],
            };
            IAuthorizationState authorization = client.ProcessUserAuthorization(null);

            if (authorization == null)
            {
                // Kick off authorization request
                var scope = new List <string>()
                {
                    "email,user_about_me",
                };
                client.RequestUserAuthorization(scope, null, null);
            }
            else
            {
                var request = WebRequest.Create("https://graph.facebook.com/me?access_token=" + Uri.EscapeDataString(authorization.AccessToken));
                using (var response = request.GetResponse())
                {
                    if (response != null)
                    {
                        using (var responseStream = response.GetResponseStream())
                        {
                            var graph   = FacebookGraph.Deserialize(responseStream);
                            var profile = UniversalProfile.ProfileFromFacebook(graph);
                            RedirectToReturnUrl(context, returnUrl, profile);
                        }
                    }
                }
            }
        }
 public IEnumerable <UniversalProfile> GetLinkedProfiles(string obj)
 {
     //Retrieve by uinque id
     using (var db = new DbManager(DbId))
     {
         var query = new SqlQuery(LinkTable)
                     .Select("profile").Where("id", obj);
         return(db.ExecuteList(query, (x) => UniversalProfile.CreateFromSerializedString((string)x[0])));
     }
 }
 public IEnumerable <string> GetLinkedObjects(UniversalProfile profile)
 {
     //Retrieve by uinque id
     using (var db = new DbManager(DbId))
     {
         var query = new SqlQuery(LinkTable)
                     .Select("id").Where("uid", profile.HashId);
         return(db.ExecuteList(query, (x) => (string)x[0]));
     }
 }
 public void RemoveLink(string obj, UniversalProfile profile)
 {
     using (var db = new DbManager(DbId))
     {
         using (var tx = db.BeginTransaction())
         {
             db.ExecuteScalar <int>(
                 new SqlDelete(LinkTable)
                 .Where("id", obj)
                 .Where("uid", profile.HashId)
                 );
             tx.Commit();
         }
     }
 }
 public void AddLink(string obj, UniversalProfile profile)
 {
     using (var db = new DbManager(DbId))
     {
         using (var tx = db.BeginTransaction())
         {
             db.ExecuteScalar <int>(
                 new SqlInsert(LinkTable)
                 .InColumnValue("id", obj)
                 .InColumnValue("uid", profile.HashId)
                 .InColumnValue("provider", profile.Provider)
                 .InColumnValue("profile", profile.ToSerializedString())
                 .InColumnValue("linked", DateTime.Now)
                 );
             tx.Commit();
         }
     }
 }
        public void ProcessRequest(HttpContext context)
        {
            var returnUrl = context.Request["returnurl"] ?? FormsAuthentication.LoginUrl;
            var auth      = context.Request["auth"];

            if (!string.IsNullOrEmpty(auth))
            {
                try
                {
                    switch (auth)
                    {
                    case "twitter":
                        DoTwitterLogin(context, returnUrl);
                        break;

                    case "facebook":
                        DoFacebookLogin(context, returnUrl);
                        break;

                    default:
                        DoOpenIdLogin(context, returnUrl);
                        break;
                    }
                }
                catch (ThreadAbortException)
                {
                    //Thats is responce ending
                }
                catch (Exception ex)
                {
                    RedirectToReturnUrl(context, returnUrl, UniversalProfile.FromError(ex));
                }
            }
            else
            {
                //Render xrds
                var xrdsloginuri = new Uri(context.Request.GetUrlRewriter(),
                                           new Uri(context.Request.GetUrlRewriter().AbsolutePath, UriKind.Relative)).ToString() + "?auth=openid&returnurl=" + returnUrl;
                var xrdsimageuri = new Uri(context.Request.GetUrlRewriter(),
                                           new Uri(context.Request.ApplicationPath, UriKind.Relative)).ToString() + "openid.gif";
                XrdsHelper.RenderXrds(context.Response, xrdsloginuri, xrdsimageuri);
            }
        }
        private void DoOpenIdLogin(HttpContext context, string returnUrl)
        {
            var response = Openid.GetResponse();

            if (response == null)
            {
                Identifier id;
                if (Identifier.TryParse(context.Request["openid_identifier"], out id))
                {
                    try
                    {
                        var request = Openid.CreateRequest(context.Request["openid_identifier"]);
                        request.AddExtension(new ClaimsRequest
                        {
                            Email      = DemandLevel.Require,
                            Nickname   = DemandLevel.Require,
                            Country    = DemandLevel.Request,
                            Gender     = DemandLevel.Request,
                            PostalCode = DemandLevel.Request,
                            TimeZone   = DemandLevel.Request,
                            FullName   = DemandLevel.Request,
                        });
                        var fetch = new FetchRequest();
                        fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email);
                        //Duplicating attributes
                        //fetch.Attributes.AddRequired("http://schema.openid.net/contact/email");//Add two more
                        //fetch.Attributes.AddRequired("http://openid.net/schema/contact/email");
                        fetch.Attributes.AddRequired(WellKnownAttributes.Name.Alias);
                        fetch.Attributes.AddRequired(WellKnownAttributes.Name.First);
                        fetch.Attributes.AddRequired(WellKnownAttributes.Name.Last);
                        fetch.Attributes.AddRequired(WellKnownAttributes.Name.Middle);
                        fetch.Attributes.AddRequired(WellKnownAttributes.Person.Gender);
                        fetch.Attributes.AddRequired(WellKnownAttributes.BirthDate.WholeBirthDate);
                        fetch.Attributes.AddRequired(WellKnownAttributes.Media.Images.Default);

                        request.AddExtension(fetch);
                        request.RedirectToProvider();
                    }
                    catch (ProtocolException ex)
                    {
                        RedirectToReturnUrl(context, returnUrl, UniversalProfile.FromError(ex));
                    }
                }
                else
                {
                    RedirectToReturnUrl(context, returnUrl, UniversalProfile.FromError(new Exception("invalid OpenID identifier")));
                }
            }
            else
            {
                // Stage 3: OpenID Provider sending assertion response
                switch (response.Status)
                {
                case AuthenticationStatus.Authenticated:
                    var spprofile    = response.GetExtension <ClaimsResponse>();
                    var fetchprofile = response.GetExtension <FetchResponse>();
                    var profile      = UniversalProfile.ProfileFromOpenId(spprofile, fetchprofile, response.ClaimedIdentifier.ToString());
                    if (!string.IsNullOrEmpty(returnUrl))
                    {
                        RedirectToReturnUrl(context, returnUrl, profile);
                    }
                    break;

                case AuthenticationStatus.Canceled:
                    RedirectToReturnUrl(context, returnUrl, UniversalProfile.FromError(new Exception("Canceled at provider")));
                    break;

                case AuthenticationStatus.Failed:
                    RedirectToReturnUrl(context, returnUrl, UniversalProfile.FromError(response.Exception));
                    break;
                }
            }
        }
 private static void RedirectToReturnUrl(HttpContext context, string returnUrl, UniversalProfile profile)
 {
     if (context.Session != null)
     {
         //Store in session
         context.Response.Redirect(new Uri(returnUrl, UriKind.Absolute).AddProfileSession(profile, context).ToString(), true);
     }
     else if (HttpRuntime.Cache != null)
     {
         context.Response.Redirect(new Uri(returnUrl, UriKind.Absolute).AddProfileCache(profile).ToString(), true);
     }
     else
     {
         context.Response.Redirect(new Uri(returnUrl, UriKind.Absolute).AddProfile(profile).ToString(), true);
     }
 }