Monday 1 July 2013

Login With Twitter And Yahoo using DotNetOpenAuth Using ASP.NET C#

Login With Twitter And Yahoo using DotNetOpenAuth Using ASP.NET C#

Hello once again,

I am currently working on a social site and found its typical to find login with twitter and yahoo. i have done it using DotNetOpenAuth. i don't want the other developer will waste their precocious time on the R&D for this topic. Hope it will work for you too.

Steps to follow:

1. Create a Empty Website in C#
2. Tools --> Library Package manager --> Package Manager Console
3. Download samples from http://dotnetopenauth.net/
3. PM> Install-Package DotNetOpenAuth
4. Now Add Reference of "OAuthConsumer.dll", "OAuthConsumer.dll"  and "DotNetOpenAuth.ApplicationBlock.dll"  from the samples
5. The HTML file will be like the following:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<%@ Register Assembly="DotNetOpenAuth.OpenId.RelyingParty.UI" Namespace="DotNetOpenAuth.OpenId.RelyingParty"
    TagPrefix="rp" %>
<%@ Register Assembly="DotNetOpenAuth.OpenId" Namespace="DotNetOpenAuth.OpenId.Extensions.SimpleRegistration"
    TagPrefix="sreg" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <rp:OpenIdButton runat="server" ImageUrl="~/images/yahoo.png" Text="Login with Yahoo!"
            ID="yahooLoginButton" Identifier="https://me.yahoo.com/" OnLoggingIn="OpenIdLogin1_LoggingIn"
            OnLoggedIn="OpenIdLogin1_LoggedIn">
            <Extensions>
                <sreg:ClaimsRequest Email="Require" />
            </Extensions>
        </rp:OpenIdButton>
        <asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="0">
            <asp:View ID="View1" runat="server">
                <h2>
                    Twitter setup</h2>
                <p>
                    A Twitter client app must be endorsed by a Twitter user.
                </p>
                <ol>
                    <li><a target="_blank" href="https://twitter.com/oauth_clients">Visit Twitter and create
                        a client app</a>. </li>
                    <li>Modify your web.config file to include your consumer key and consumer secret.</li>
                </ol>
            </asp:View>
            <asp:View ID="View2" runat="server">
                <asp:ImageButton ImageUrl="~/images/Sign-in-with-Twitter-darker.png" runat="server"
                    AlternateText="Sign In With Twitter" ID="signInButton" OnClick="signInButton_Click" />
                <asp:CheckBox Text="force re-login" runat="server" ID="forceLoginCheckbox" />
                <br />
                <asp:Panel runat="server" ID="loggedInPanel" Visible="false">
                    Now logged in as
                    <asp:Label Text="[name]" runat="server" ID="loggedInName" />
                </asp:Panel>
            </asp:View>
        </asp:MultiView>
    </div>
    </form>
</body>
</html>


And the code file will be as:

using System;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;
using DotNetOpenAuth.OpenId.Extensions.ProviderAuthenticationPolicy;
using DotNetOpenAuth.OpenId.Extensions.SimpleRegistration;
using DotNetOpenAuth.OpenId.RelyingParty;
using DotNetOpenAuth.OAuth;
using DotNetOpenAuth.ApplicationBlock;
using OAuthConsumer;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (TwitterConsumer.IsTwitterConsumerConfigured)
        {
            this.MultiView1.ActiveViewIndex = 1;

            if (!IsPostBack)
            {
                string screenName;
                int userId;
                if (TwitterConsumer.TryFinishSignInWithTwitter(out screenName, out userId))
                {
                    this.loggedInPanel.Visible = true;
                    this.loggedInName.Text = screenName;

                    // In a real app, the Twitter username would likely be used
                    // to log the user into the application.
                    ////FormsAuthentication.RedirectFromLoginPage(screenName, false);
                }
            }
        }
    }
    protected void OpenIdLogin1_LoggingIn(object sender, OpenIdEventArgs e)
    {
        this.prepareRequest(e.Request);
    }
    /// <summary>
/// Fired upon login.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="DotNetOpenAuth.OpenId.RelyingParty.OpenIdEventArgs"/> instance containing the event data.</param>
/// <remarks>
/// Note, that straight after login, forms auth will redirect the user
/// to their original page. So this page may never be rendererd.
/// </remarks>
protected void OpenIdLogin1_LoggedIn(object sender, OpenIdEventArgs e) {
State.FriendlyLoginName = e.Response.FriendlyIdentifierForDisplay;
State.ProfileFields = e.Response.GetExtension<ClaimsResponse>();
            //Response.Write(State.ProfileFields.BirthDate.Value.ToString());
            Response.Write(State.ProfileFields.Country);
            Response.Write(State.ProfileFields.Email);
            Response.Write(State.ProfileFields.FullName);
            Response.Write(State.ProfileFields.Gender);
            Response.Write(State.ProfileFields.MailAddress.DisplayName);
            Response.Write(State.ProfileFields.Nickname);
            Response.Write(State.ProfileFields.PostalCode);
       
State.PapePolicies = e.Response.GetExtension<PolicyResponse>();
}
    private void prepareRequest(IAuthenticationRequest request)
    {
        // Collect the PAPE policies requested by the user.
        List<string> policies = new List<string>();
        //foreach (ListItem item in this.papePolicies.Items)
        //{
        //    if (item.Selected)
        //    {
        //        policies.Add(item.Value);
        //    }
        //}

        // Add the PAPE extension if any policy was requested.
        var pape = new PolicyRequest();
        if (policies.Count > 0)
        {
            foreach (string policy in policies)
            {
                pape.PreferredPolicies.Add(policy);
            }
        }

        //if (this.maxAuthTimeBox.Text.Length > 0)
        //{
        //    pape.MaximumAuthenticationAge = TimeSpan.FromSeconds(double.Parse(this.maxAuthTimeBox.Text));
        //}

        if (pape.PreferredPolicies.Count > 0 || pape.MaximumAuthenticationAge.HasValue)
        {
            request.AddExtension(pape);
        }
    }

    protected void signInButton_Click(object sender, ImageClickEventArgs e)
    {
        TwitterConsumer.StartSignInWithTwitter(this.forceLoginCheckbox.Checked).Send();
    }
}


Create a Class file and add the following code to that :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DotNetOpenAuth.OpenId.Extensions.AttributeExchange;
using DotNetOpenAuth.OpenId.Extensions.ProviderAuthenticationPolicy;
using DotNetOpenAuth.OpenId.Extensions.SimpleRegistration;

/// <summary>
/// Summary description for Class1
/// </summary>
public class State
{
    public static ClaimsResponse ProfileFields
    {
        get { return HttpContext.Current.Session["ProfileFields"] as ClaimsResponse; }
        set { HttpContext.Current.Session["ProfileFields"] = value; }
    }

    public static FetchResponse FetchResponse
    {
        get { return HttpContext.Current.Session["FetchResponse"] as FetchResponse; }
        set { HttpContext.Current.Session["FetchResponse"] = value; }
    }

    public static string FriendlyLoginName
    {
        get { return HttpContext.Current.Session["FriendlyUsername"] as string; }
        set { HttpContext.Current.Session["FriendlyUsername"] = value; }
    }

    public static PolicyResponse PapePolicies
    {
        get { return HttpContext.Current.Session["PapePolicies"] as PolicyResponse; }
        set { HttpContext.Current.Session["PapePolicies"] = value; }
    }

    public static string GoogleAccessToken
    {
        get { return HttpContext.Current.Session["GoogleAccessToken"] as string; }
        set { HttpContext.Current.Session["GoogleAccessToken"] = value; }
    }

    public static void Clear()
    {
        ProfileFields = null;
        FetchResponse = null;
        FriendlyLoginName = null;
        PapePolicies = null;
        GoogleAccessToken = null;
    }
}
And add the following lines to web config:

 <!-- Fill in your various consumer keys and secrets here to make the sample work. -->
    <!-- You must get these values by signing up with each individual service provider. -->
    <!-- Twitter sign-up: https://twitter.com/oauth_clients -->
    <add key="twitterConsumerKey" value="************" />
    <add key="twitterConsumerSecret" value="************" />
    <!-- Google sign-up: https://www.google.com/accounts/ManageDomains -->
    <add key="googleConsumerKey" value="anonymous" />
    <add key="googleConsumerSecret" value="anonymous" />
    <!-- Yammer sign-up: https://www.yammer.com/client_applications/new -->
    <add key="yammerConsumerKey" value="" />
    <add key="yammerConsumerSecret" value="" />


That's all