Subtext 2: OpenID Login Support

The recent Subtext 2 release includes a feature I worked on: OpenID login support. Let’s take a quick look at how you use it, then we’ll talk about the how the code works and why it’s a useful feature.

What’s OpenID?

I’m a big fan of digital identity, and could ramble on about OpenID for a while. But if I did that, this blog post would be published sometime after Windows 7 ships. Fortunately I pushed OpenID on some people who are a bit more prolific than I’ve been of late, so I’ll refer you to this post by Jeff Atwood (CodingHorror) and this webcast by Rob Conery. Scott Hanselman wrote a great overview of OpenID, as well.

The elevator pitch: Rather than being issued an account at every single website you login to, you issue them one. You establish an OpenID URL, which only you can login to, and then you give it as your account information to sites which support OpenID authentication. You’re in control of your account, you’ve got a central place to manage your password, etc.

OpenID is a generic account that you can reuse on other websites.

Too Hard! Couldn’t I Just Fax Someone My Birth Certificate?

If you haven’t used OpenID, this is going to look complex. That’s because I’m showing you the hard case – it’s like learning to play Stairway To Heaven when you don’t have a guitar or amp. The first time through, we’re going to have to run down to the pawn shop to get you a Fender knockoff and a thrasher amp, but the next time you’re ready to rock you’ll be all set. So hang with me while we get setup, and at the end I’ll show you how it will work when you log in to your site tomorrow.

Step 1: Get an OpenID

There’s a good chance you’ve already got an OpenID, since many popular services like Flickr, Yahoo, and Blogger are OpenID providers, meaning that you can user your account with those services as an OpenID identity:

If you don’t have an account with any of those services (or these on the OpenID public providers list), I recommend signing up with MyOpenID.com – they’ve got great support, and rich security features if you want to use them, such as InfoCard integration and phone verification.

Step 2: Tell Subtext What OpenID URL You’ll Be Using

The Security / Options tab has a new location where you can enter an OpenID URL. It’s important that you get this right – we’ll try to clean this up for you, but I recommend you type this as exactly as possible. In my case, my OpenID URL is http://jongalloway.myopenid.com/, not jongalloway.myopenid.com. Even the trailing slash is important.

Note that to in order to make this setting, I’ve logged in to Subtext using my standard Subtext username and password. That login doesn’t go away when I setup OpenID authentication, I’ve just enabled an additional security feature – I’ve got two ways to login to my blog now.

Subtext - Security Options (OpenID)

Step 3: Login Using OpenID

Now that Subtext knows my OpenID URL, I can use it to login to the site. The login dialog includes an OpenID sign-in prompt at the bottom, so I enter my OpenID URL in the prompt and click Login.

Subtext - OpenID Login

Now here’s the part you may not be expecting if you haven’t used OpenID – I need to login at my OpenID provider. That’s not such a big deal, though, because myOpenID (and many other providers) have a “Stay Signed In” option option, which is appropriate if you’re logging in from a computer which is in a secure location (your home, a work computer you keep locked, etc.). The Versisign Seatbelt Firefox Extension is a pretty handy way to sign in to your OpenID identity once for a browser session, too.

Subtext - myOpenID Login

Now, the first time I log in to myOpenID from my Subtext blog, myOpenID is going to ask me if that’s cool. Again, a little unexpected if you haven’t used OpenID before, but this is a one time thing. We’re telling myOpenID that my Subtext blog is going

Subtext - myOpenID Verification

So, I type in my password and click the Sign Button, and my OpenID provider redirects me back to my Subtext instance (with an “authenticated” message), and Subtext logs me in:

Subtext - Admin

Fine. Now Show Me Easy.

Thanks for hanging in there. Here’s how it looks tomorrow, providing you’ve checked that “Stay Signed In” checkbox. First, we browse to the login screen, enter our OpenID URL, and click Login:

Subtext - OpenID Login

Now, we’re automatically logged in and brought to our admin screen:

Subtext - Admin

If you hadn’t checked that Stay Signed On checkbox, you’d get one screen in the middle – the login page for your OpenID provider’s page.

How’s It Work?

That’s the subject of another post, but let me show you one quick screenshot which shows the HTTP traffic during that last login.

Subtext - OpenID trace (Fiddler)

That shows the general sequence of events:

  1. I requested the Login page (it’s running on my local machine – 127.0.0.1)
  2. The DotNetOpenID login control makes a request to the URL I provided, saying “Yo. My URL is 127.0.0.1:2732, can you authenticate the user and verify that I’m on their list of sites?”
  3. There’s a little negotiation between the two sites, after which myOpenID returns an “Okay” message via SSL.

Show Us Your Code

Sure. For this release, I just used the DotNetOpenID.OpenIdLogin control, which is as simple as dropping the control on the page and handling the LoggedIn event. Scott Hanselman wrote about this before when he set up OpenID on DasBlog. In the case of Subtext, here’s the code I added for that LoggedIn event:

protected void btnOpenIdLogin_LoggedIn(object sender, OpenIdEventArgs e)
 {
   e.Cancel = true; //required to prevent logging everyone in
   if (e.Response.Status == AuthenticationStatus.Authenticated &&
       SecurityHelper.Authenticate(e.ClaimedIdentifier, chkRememberMe.Checked))
    {
         ReturnToUrl(Config.CurrentBlog.AdminHomeVirtualUrl);
    }
} 

You can see it in context in the Subtext SVN browser. Now that I’ve worked with it, I’d like to ditch the OpenIdLogin control for a future release. It works just fine, but it generates HTML that I’m not very happy with (table based markup, not CSS friendly). In the future, I’d probably write my own control and just use the libraries which are included in DotNetOpenID – they’ve been great.

OpenID Passthrough

There’s another new OpenID feature in Subtext 2.0 – OpenID Passthrough. The idea there is that you can use your blog URL as your OpenID URL, and it just redirects over to your “real” OpenID provider. Let’s assume that my blog was deployed to http://jongalloway.com; in that case I could make the following OpenID Passthrough settings on the Subtext / Configure screen, after which I could use http://jongalloway.com as my OpenID URL.

Subtext - OpenID Passthrough

101 Comments

  • Jon,

    Great post. Before you write your own control to replace the OpenIdLogin control though, have you looked at the OpenIdTextBox control? It is more streamlined and doesn't use tables. It might save you some time.

  • @aarnott - Thanks, I hadn't seen that! Thanks again for all your work on DotNetOpenID.

  • You're welcome, Jon! I'm just glad to see it used. :)

    Also, check out http://nerdbank.org/RP.exp/ajaxlogin.aspx, which is a prototype OpenIdAjaxTextBox that I'm building for a future version of DotNetOpenId especially for blogs.

  • Optimists always picture themselves accomplishing their goals.

  • It really helps me to complete my project and the technique is interested for beginners as well.

  • What a review! Very useful on the other hand obvious to see. Looking for more such blogposts! Can you have a twitter again? My wife and I highly recommend the idea in stumbleupon. The solution is being lost is the amount of dye. Even so appreciate your site.

  • Commenting on this site is a pleasure for me. I had really liked reading this site it was very good. The content of this blog was very nice. Like it!

  • Thanks for sharing this. It was really an interesting and informative article.


  • I will immediately grasp your rss as I can not in finding your e-mail subscription hyperlink or e-newsletter
    service. Do you have any? Please allow me understand
    so that I could subscribe. Thanks.

  • Have you ever thought about including a little bit more than just your
    articles? I mean, what you say is important and everything.
    Nevertheless just imagine if you added some great photos or videos
    to give your posts more, "pop"! Your content is excellent but with pics and videos, this blog could
    certainly be one of the very best in its field.
    Awesome blog!

  • Hmm is anyone else having problems with the pictures on this blog loading?
    I'm trying to find out if its a problem on my end or if it's the blog.
    Any feed-back would be greatly appreciated.

  • I believe what you wrote made a ton of sense. However, think about this,
    what if you typed a catchier post title? I mean, I don't want to tell you how to run your website, but suppose you added a post title that makes people desire more? I mean Subtext 2: OpenID Login Support - Jon Galloway is kinda boring. You could look at Yahoo's front
    page and see how they create article headlines to grab people interested.
    You might add a related video or a related picture or two
    to grab readers interested about everything've got to say. In my opinion, it would make your website a little livelier.

  • It's remarkable to visit this website and reading the views of all friends on the topic of this post, while I am also keen of getting knowledge.

  • I was recommended this blog by way of my cousin.
    I am no longer sure whether or not this put up is written through him as no one else realize such precise approximately my
    difficulty. You are amazing! Thanks!

  • Hi it's me, I am also visiting this web site daily, this site is genuinely good and the users are genuinely sharing nice thoughts.

  • Hi there! I could have sworn I've been to this blog before but after looking at some of the articles I realized it's new to me.

    Nonetheless, I'm certainly happy I found it and I'll be
    book-marking it and checking back often!

  • What's up colleagues, how is everything, and what you would like to say about this piece of writing, in my view its actually amazing for me.

  • I feel that is one of the most significant information for me.
    And i'm glad studying your article. But want to statement on few normal things, The web site taste is wonderful, the articles is actually excellent : D. Good task, cheers

  • Howdy! This post could not be written any better!

    Reading this post reminds me of my previous room mate! He always kept talking about
    this. I will forward this article to him. Fairly certain he will have a good read.
    Many thanks for sharing!

  • I am really inspired together with your writing skills and also with the layout
    on your blog. Is that this a paid subject or did you modify it yourself?
    Either way keep up the nice quality writing, it is rare to look a great
    weblog like this one these days..

  • Please let me know if you're looking for a article writer for your site. You have some really great articles and I believe I would be a good asset. If you ever want to take some of the load off, I'd love to write some articles for your blog
    in exchange for a link back to mine. Please shoot me an e-mail
    if interested. Regards!

  • Hi there! I just wanted to ask if you ever have any trouble with hackers?
    My last blog (wordpress) was hacked and I ended up losing a few months of hard
    work due to no back up. Do you have any methods to protect against hackers?

  • It is indeed my great delight to think about your website also to appreciate your current fantastic content right here. I favor that quite definitely. I am aware which you placed considerably focus of those articles, since every one of them sound right and so are invaluable

  • I pay a visit each day some web sites and blogs to read articles,
    but this weblog offers feature based writing.

  • I know this site provides quality depending articles
    or reviews and extra material, is there any other website which provides these kinds of things in quality?

  • I was wondering if you ever thought of changing the page layout of
    your website? Its very well written; I love what youve got to say.

    But maybe you could a little more in the
    way of content so people could connect with it better. Youve got an awful lot of text for
    only having one or 2 pictures. Maybe you could space it out better?

  • At this time it sounds like BlogEngine is the best
    blogging platform out there right now. (from what I've read) Is that what you are using on your blog?

  • We certainly adore exactly how it’s simple upon my personal eye and also the truth is well crafted. I’m asking yourself generate an income may be informed each time a brand new publish may be created. I’ve bought for your feed that should have the desired effect! Possess a good day time!

  • Great beat ! I would like to apprentice while you amend your
    site, how can i subscribe for a blog web site? The account aided me
    a acceptable deal. I had been a little bit acquainted of this your
    broadcast offered bright clear concept

  • I'm impressed, I must say. Seldom do I come across a blog that's both
    educative and amusing, and let me tell you, you have hit
    the nail on the head. The issue is an issue that too few men and women are speaking intelligently about.

    Now i'm very happy that I came across this in my search for something regarding this.

  • Your own write-up offers confirmed necessary to myself.
    It’s very educational and you really are obviously extremely educated in this field.
    You get popped my personal sight to be able to different
    thoughts about this particular subject matter along with intriguing, notable and strong content.

  • However there are some some dawbacks to reverse osmosis treatment used in the home that you need to
    be aware of. For example, Chlorine is used as a disinfectant in the
    treatment process by municipalities. De-mineralized water contains more hydrogen and thus is more acidic.

  • You ought to take part in a contest for one of the
    best blogs on the web. I most certainly will recommend this site!

  • wonderful submit, very informative. I ponder why the other experts of this sector don't understand this. You must continue your writing. I'm confident, you have a great readers' base already!

  • Its like you read my mind! You seem to know a lot about this, like
    you wrote the book in it or something. I think that you could do
    with a few pics to drive the message home a little bit, but
    instead of that, this is magnificent blog. A great read.
    I'll definitely be back.

  • It's a shame you don't have a donate button! I'd definitely donate to this brilliant blog! I suppose for now i'll settle for book-marking and adding your RSS feed to my Google account.
    I look forward to fresh updates and will talk about this website with my
    Facebook group. Chat soon!

  • I think that is one of the such a lot important
    information for me. And i am satisfied reading your
    article. However should observation on few general things, The web site taste is
    ideal, the articles is in reality nice : D. Just right task, cheers

  • Hey there just wanted to give you a brief heads up and let you know
    a few of the images aren't loading properly. I'm not sure why but I think
    its a linking issue. I've tried it in two different web browsers and both show the same outcome.

  • Does your site have a contact page? I'm having a tough time locating it but, I'd like to shoot you an e-mail.
    I've got some recommendations for your blog you might be interested in hearing. Either way, great blog and I look forward to seeing it develop over time.

  • The poisons secreted from the frogs skin is potent enough
    to kill a human. Most of these stunning and charming dovolená spots, if one received a three to four days.
    If you're anything like me, you like to surf the breakers. There are many expats who live in the Southeast in this article. Consider a vacation in Bradenton, Florida offers beachgoers the option of going out for the office party.

  • In this guide, I will explain the two most simple methods.
    These are some of the other European destinations because of the representation of the colors when
    it is an aroma. You'll start feeling better. The All Inclusive Resortss, for Valentine's Day is celebrated
    in different cultures and habits and get to know the timings.
    And if you shop for all inclusive resorts gift shopping.

    In Paris, for instance.

  • You will definitely need a lot of action. Deal ConglomeratesDeal conglomerates such as Travel
    Zoo are the best bets for finding you great vacation home rentals.
    Vacation Home Rentals consists of three distinct areas. In
    fact, many seek Maldives flight deals just to experience the
    local culture, you may find it difficult to choose.

  • If herbalife review the sound waves are not focused towards the listener, sound quality will suffer from echoes and interference.
    Australian Shepherds have always been traditional pets for work such as
    herding. Selling surplus herbalife review products can be an effective way of marketing
    products to a large group.

  • I am genuinely happy to read this website posts which
    includes plenty of helpful information, thanks for providing these statistics.

  • The computer's running might start to acquire stricken, plus the vendor may suffer a substandard penetration of results, the manufacturers web-site ought to be been to now. The normal computer usage can damage the driver if it over time used, or damaged by the effects of malicious software, such as viruses. As the water begins to give you support, slowly rise to the standing position by extending your legs until your knees are slightly bent.

  • The computers running might start to acquire stricken, plus the vendor may suffer a substandard penetration of results, the manufacturers web-site ought to be been to now. The normal computer usage can damage the driver if it over time used, or damaged by the effects of malicious software, such as viruses. As the water begins to give you support, slowly rise to the standing position by extending your legs until your knees are slightly bent.

  • I am genuinely happy to read this website posts which
    includes plenty of helpful information, thanks for providing these statistics.

  • The computers running might start to acquire stricken, plus the vendor may suffer a substandard penetration of results, the manufacturers web-site ought to be been to now. The normal computer usage can damage the driver if it over time used, or damaged by the effects of malicious software, such as viruses. As the water begins to give you support, slowly rise to the standing position by extending your legs until your knees are slightly bent.

  • The computers running might start to acquire stricken, plus the vendor may suffer a substandard penetration of results, the manufacturers web-site ought to be been to now. The normal computer usage can damage the driver if it over time used, or damaged by the effects of malicious software, such as viruses. As the water begins to give you support, slowly rise to the standing position by extending your legs until your knees are slightly bent.

  • The computers running might start to acquire stricken, plus the vendor may suffer a substandard penetration of results, the manufacturers web-site ought to be been to now. The normal computer usage can damage the driver if it over time used, or damaged by the effects of malicious software, such as viruses. As the water begins to give you support, slowly rise to the standing position by extending your legs until your knees are slightly bent.

  • The computers running might start to acquire stricken, plus the vendor may suffer a substandard penetration of results, the manufacturers web-site ought to be been to now. The normal computer usage can damage the driver if it over time used, or damaged by the effects of malicious software, such as viruses. As the water begins to give you support, slowly rise to the standing position by extending your legs until your knees are slightly bent.

  • Hello, just wanted to tell you, I enjoyed this post.
    It was funny. Keep on posting!

  • The computers running might start to acquire stricken, plus the vendor may suffer a substandard penetration of results, the manufacturers web-site ought to be been to now. The normal computer usage can damage the driver if it over time used, or damaged by the effects of malicious software, such as viruses. As the water begins to give you support, slowly rise to the standing position by extending your legs until your knees are slightly bent.

  • The computers running might start to acquire stricken, plus the vendor may suffer a substandard penetration of results, the manufacturers web-site ought to be been to now. The normal computer usage can damage the driver if it over time used, or damaged by the effects of malicious software, such as viruses. As the water begins to give you support, slowly rise to the standing position by extending your legs until your knees are slightly bent.

  • The computers running might start to acquire stricken, plus the vendor may suffer a substandard penetration of results, the manufacturers web-site ought to be been to now. The normal computer usage can damage the driver if it over time used, or damaged by the effects of malicious software, such as viruses. As the water begins to give you support, slowly rise to the standing position by extending your legs until your knees are slightly bent.

  • The computers running might start to acquire stricken, plus the vendor may suffer a substandard penetration of results, the manufacturers web-site ought to be been to now. The normal computer usage can damage the driver if it over time used, or damaged by the effects of malicious software, such as viruses. As the water begins to give you support, slowly rise to the standing position by extending your legs until your knees are slightly bent.

  • The computers running might start to acquire stricken, plus the vendor may suffer a substandard penetration of results, the manufacturers web-site ought to be been to now. The normal computer usage can damage the driver if it over time used, or damaged by the effects of malicious software, such as viruses. As the water begins to give you support, slowly rise to the standing position by extending your legs until your knees are slightly bent.

  • The computers running might start to acquire stricken, plus the vendor may suffer a substandard penetration of results, the manufacturers web-site ought to be been to now. The normal computer usage can damage the driver if it over time used, or damaged by the effects of malicious software, such as viruses. As the water begins to give you support, slowly rise to the standing position by extending your legs until your knees are slightly bent.

  • The computers running might start to acquire stricken, plus the vendor may suffer a substandard penetration of results, the manufacturers web-site ought to be been to now. The normal computer usage can damage the driver if it over time used, or damaged by the effects of malicious software, such as viruses. As the water begins to give you support, slowly rise to the standing position by extending your legs until your knees are slightly bent.

  • Hello, i read your blog occasionally and i own a similar one and i was just wondering if you get a lot of spam comments?
    If so how do you reduce it, any plugin or anything you can
    advise? I get so much lately it's driving me insane so any help is very much appreciated.

  • Awesome! Its in fact amazing piece of writing, I have
    got much clear idea regarding from this paragraph.

  • I was recommended this blog through my cousin.
    I am no longer sure whether or not this submit is written via him as no
    one else realize such targeted approximately my difficulty.
    You're amazing! Thanks!

  • What's Taking place i'm new to this, I stumbled
    upon this I've discovered It absolutely useful and it has helped me out loads. I am hoping to contribute & aid other customers like its helped me. Great job.

  • Excellent blog here! Also your website loads up fast!
    What host are you using? Can I get your affiliate link to your host?
    I wish my web site loaded up as fast as yours lol

  • Because the admin of this web site is working, no doubt very quickly it will be famous,
    due to its quality contents.

  • I am really loving the theme/design of your weblog.
    Do you ever run into any internet browser compatibility problems?
    A handful of my blog visitors have complained about
    my website not working correctly in Explorer but looks great in Safari.
    Do you have any recommendations to help fix this issue?

  • Having read this I thought it was really informative.
    I appreciate you finding the time and energy
    to put this article together. I once again find myself
    personally spending a lot of time both reading and posting comments.
    But so what, it was still worth it!

  • Hello there! This post could not be written any better!
    Going through this article reminds me of my previous roommate!

    He always kept talking about this. I am going to send this post to him.
    Fairly certain he'll have a very good read. Many thanks for sharing!

  • Article writing is also a fun, if you be familiar with then you can write if not it is complex to write.

  • Hello i am kavin, its my first time to commenting anywhere, when
    i read this paragraph i thought i could also create comment due to
    this brilliant piece of writing.

  • Thanks , I have just been searching for information about this topic for ages and yours is the greatest I've came upon till now. However, what concerning the bottom line? Are you sure in regards to the supply?

  • It's remarkable in support of me to have a web page, which is useful in support of my know-how. thanks admin

  • Terrific work! That is the type of info that are supposed to be shared across the net.

    Shame on the search engines for no longer positioning this
    publish upper! Come on over and consult with my web site .
    Thanks =)

  • Wow, wonderful blog layout! How long have you been blogging for?
    you make blogging look easy. The overall look of your web site is fantastic, as well as the content!

  • Heya i'm for the first time here. I came across this board and I find It truly helpful & it helped me out much. I'm hoping to present something
    again and help others such as you aided me.

  • Hmm it looks like your blog ate my first comment (it was super long) so I
    guess I'll just sum it up what I wrote and say, I'm
    thoroughly enjoying your blog. I as well am an aspiring blog blogger but I'm still new to the whole thing. Do you have any recommendations for rookie blog writers? I'd definitely appreciate it.

  • We are a bunch of volunteers and starting a new scheme in our community.
    Your web site provided us with valuable info to work on.
    You have done a formidable activity and our whole community will likely be thankful to you.

  • It's very straightforward to find out any matter on net as compared to books, as I found this paragraph at this web site.

  • An impressive share! I've just forwarded this onto a friend who had been conducting a little research on this. And he actually bought me breakfast because I stumbled upon it for him... lol. So allow me to reword this.... Thanks for the meal!! But yeah, thanks for spending time to discuss this issue here on your internet site.

  • Heya fantastic website! Does running a blog similar to this take
    a lot of work? I've no understanding of programming however I was hoping to start my own blog soon. Anyhow, if you have any recommendations or tips for new blog owners please share. I understand this is off subject nevertheless I simply needed to ask. Kudos!

  • Right now it sounds like Wordpress is the preferred
    blogging platform available right now. (from what I've read) Is that what you're using on your blog?

  • Hey, I think your blog might be having browser compatibility issues.
    When I look at your blog site in Opera, it looks fine but when opening in
    Internet Explorer, it has some overlapping. I just wanted
    to give you a quick heads up! Other then that, wonderful blog!

  • I am genuinely grateful to the holder of this web site who has shared this fantastic article at at
    this time.

  • Howdy! This article couldn't be written any better! Reading through this article reminds me of my previous roommate! He constantly kept preaching about this. I most certainly will forward this article to him. Fairly certain he'll have a
    very good read. Thanks for sharing!

  • Wow that was odd. I just wrote an really long comment
    but after I clicked submit my comment didn't appear. Grrrr... well I'm not writing all that over again.
    Anyways, just wanted to say superb blog!

  • Wonderful work! That is the kind of info that are meant to be shared around the
    net. Shame on the search engines for no longer positioning this publish higher!
    Come on over and consult with my web site . Thanks =)

  • You've made some really good points there. I looked on the net for more information about the issue and found most individuals will go along with your views on this website.

  • You are so awesome! I do not suppose I've truly read something like that before. So wonderful to discover somebody with genuine thoughts on this issue. Seriously.. many thanks for starting this up. This site is something that's needed on the
    web, someone with a little originality!

  • This is a topic that is near to my heart... Best wishes!
    Where are your contact details though?

  • Hello to all, how is the whole thing, I think every one is
    getting more from this site, and your views are nice in
    support of new people.

  • I've been browsing online more than 3 hours as of late, yet I never found any attention-grabbing article like yours. It is pretty value enough for me. In my opinion, if all web owners and bloggers made excellent content as you probably did, the web will be a lot more helpful than ever before.

  • You could definitely see your skills within the article you write.
    The sector hopes for even more passionate writers like you who aren't afraid to mention how they believe. At all times follow your heart.

  • Link exchange is nothing else however it is simply placing the
    other person's web site link on your page at appropriate place and other person will also do similar for you.

  • Hi there, every time i used to check blog posts here in the
    early hours in the daylight, as i love to find out more and more.

  • My partner and I stumbled over here coming from a
    different page and thought I might as well check things out.
    I like what I see so i am just following you. Look forward to looking over your web page again.

  • Thanks for finally writing about >Subtext 2: OpenID Login Support -
    Jon Galloway <Loved it!

  • Remarkable issues here. I am very happy to look your
    post. Thanks so much and I'm taking a look forward to touch you. Will you kindly drop me a e-mail?

  • When some one searches for his essential thing,
    so he/she desires to be available that in detail, thus that thing
    is maintained over here.

  • hello great post getting an open id is a good idea thank you

  • Thankfulness to my father who stated to me concerning this
    weblog, this web site is actually amazing.

  • Hello! Do you use Twitter? I'd like to follow you if that would be okay. I'm
    undoubtedly enjoying your blog and look forward to new updates.

Comments have been disabled for this content.