facebookidentity-managementidentityserver3membershipreboot

Thinktecture IdentityServer3 Facebook Login Button Issue


I am using "IdentityServer3 - IdentityManager - MembershipReboot" in my project for User Management, Authentication & Resources Authorization.

I started from below sample and have gone good for creating users, authenticating them via /connect/token api and authorizing resources. https://github.com/thinktecture/Thinktecture.IdentityServer.v3.Samples/tree/master/source/MembershipReboot

A brief architecture for my solution is

  1. MySql as database. Communication via MembershipReboot.EF to MembershipReboot.

  2. The client project is developed using html + angularjs.

  3. Resources APIs are developed using Nancy & hosted on Owin+Katana in a seperate project.

  4. Authentication Services(IdSvr+IdMgr+MR) are hosted in a seperate project.

Now I want to create a simple button/link clicking on which leads me to facebook login. The functionality of this button should be same as defined in IDSvr default login page's(https://localhost:44333/core/login?signin=4f909a877cc465afd26d72f60ec08f51) "Facebook button".

I have tried googled internet a lot but none of cases are matching my scenario. I even tried to replicate the request-response behaviour of default IdSvr facebook login but that does not work as cookies are not being saved on end client.

Also i tried to hit "https://localhost:44333/core/signin-facebook" and getting response as HTTP/1.1 500 Internal Server Error from server. So i think might be I am somewhere wrong in setting facebook options in IdSrv project.

So if someone can just provide me a single IdSvr API to connect or tell me how to config Id Svr so that mapping a url can redirect it to facebook login. Or can tell me that where I am wrong in setting facebook authentication options in IdSrv.


Solution

  • A short and simple answer for my question is that I was looking for url.

    https://localhost:44333/connect/authorize?client_id=implicitclient&response_type=token&scope=read&redirect_uri=http://localhost:8088/login/auth&nonce=random_nonce&acr_values=idp%3AFacebook&response_mode=form_post

    Read further if you want to get better idea about this url

    After lots of Hit&Trial & Study efforts, I have got solution for this. Well I think root cause for this problem was that sudden new technical things(Owin, Katana, OAuth, IdentityServer, IdentityManagement, MembershipReboot, Owin Facebook) and a meager time to understand them all.

    I would advice folks that whoever is in same situation as me then first get an idea about OAuth. I found below link as a short and good one.

    http://tutorials.jenkov.com/oauth2/index.html

    After this I learnt that in our scenario we are dealing with two applications and hence two authentication.

    1. For connecting User to Facebook. We created an app on developers.facebook.com

    2. For connecting User to IdentityServer. We created a client in Clients.cs file on AuthenticationServices project.

    So now here is the final solution. localhost:44333 where AuthenticationService is running locahost:8088 where FrontEnd services are running which iscalling AuthenticationService .

    1. Create client app in AuthenticationServices as below

                new Client
                {
                    ClientName = "Implicit Clients",
                    Enabled = true,
                    ClientId = "implicitclient",
                    ClientSecrets = new List<ClientSecret>{
                        new ClientSecret("secret".Sha256())
                    },
                    Flow = Flows.Implicit,
                    RequireConsent = true,
                    AllowRememberConsent = true,
    
                    RedirectUris = new List<string>
                    {
                        "http://localhost:8088/login/auth" //This should be redirect url you want to hit after your app(not facebook app) redirects. 
                    },
    
                    ScopeRestrictions = new List<string>
                    { 
                        Constants.StandardScopes.OpenId,
                        Constants.StandardScopes.Profile,
                        Constants.StandardScopes.Email,
                        "read",
                        "write",
                    },
    
                    //SubjectType = SubjectTypes.Global,
                    AccessTokenType = AccessTokenType.Jwt,
    
                    IdentityTokenLifetime = 360,
                    AccessTokenLifetime = 360,
                },
    

    2 Create Authorize URL as below

         var client = new OAuth2Client(new Uri("https://localhost:44333/core/connect/authorize"));
            var startUrl = client.CreateAuthorizeUrl(
                clientId: "implicitclient",
                responseType: "token",
                scope: "read",
                redirectUri: "http://localhost:8088/login/auth",
                nonce: "random_nonce",
                responseMode: "form_post",
                acrValues: "idp:Facebook");
    
    1. The facebook app after successful authorization will redirect default to http://localhost:44333/signin-facebook. So no need to do any changes there.

    2. Finally on http://localhost:8088/login/auth you will get access_token(+ few other parameters) after successful authentication. Here onwards you can use this token to access resources from Resources server.