Example #1
0
        public async Task <T> IdentifyAsync <T>(AuthenticationProvider provider, ACSProvider ACSProvider = null) where T : Identity, new()
        {
            var vault = new Windows.Security.Credentials.PasswordVault();

            try
            {
                var tok = vault.Retrieve(AccessControlNamespace, provider.ToString());
                if (IsExpired(tok.Password))
                {
                    vault.Remove(tok);
                }
                else
                {
                    return(new T()
                    {
                        Token = tok.Password, Success = true, Provider = provider
                    });
                }
            }
            catch (Exception ex)
            {
            }


            string LoginUrl      = "";
            string BouncerEndUrl = "";

            switch (provider)
            {
            case AuthenticationProvider.AzureControlService:
                if (ACSProvider != null)
                {
                    LoginUrl = ACSProvider.LoginUrl;
                }
                else
                {
                    if (string.IsNullOrEmpty(AccessControlNamespace))
                    {
                        throw new ArgumentNullException("AccessControlNamespace");
                    }
                    if (string.IsNullOrEmpty(Realm))
                    {
                        throw new ArgumentNullException("Realm");
                    }
                    if (string.IsNullOrEmpty(BouncerReplyUrl))
                    {
                        throw new ArgumentNullException("BouncerReplyUrl");
                    }
                    LoginUrl = string.Format(ACS_Login_Feed,
                                             AccessControlNamespace,
                                             Realm, BouncerReplyUrl);
                }
                BouncerEndUrl = BouncerReplyUrl + "end";
                break;

            case AuthenticationProvider.Facebook:
                LoginUrl = string.Format(Facebook_Login_Feed,
                                         Uri.EscapeDataString(FacebookApplicationID),
                                         Uri.EscapeDataString(Facebook_LoginSucces));
                BouncerEndUrl = Facebook_LoginSucces;
                break;
            }


            return(await WebAuthenticationBroker.AuthenticateAsync(
                       WebAuthenticationOptions.None,
                       new Uri(LoginUrl),
                       new Uri(BouncerEndUrl)).AsTask <WebAuthenticationResult>()
                   .ContinueWith <T>(t =>
            {
                var response = t.Result;
                if (!t.IsFaulted && (response.ResponseStatus == WebAuthenticationStatus.Success))
                {
                    string token = response.ResponseData;                  // response.ResponseData.Substring(response.ResponseData.IndexOf('=') + 1);
                    token = token.Replace(BouncerEndUrl, "").Substring(1); //Assume that the url is the BouncerEndUrl + '#' / '?' + claims.

                    if (provider == AuthenticationProvider.Facebook)
                    {
                        var idx = token.IndexOf("&expires_in=");
                        var time = int.Parse(token.Substring(idx + 12));
                        token = token.Insert(idx, string.Format("&ExpiresOn={0}", (int)DateTime.UtcNow.Add(TimeSpan.FromSeconds(time)).Subtract(Epoch).TotalSeconds));
                    }

                    if (UsePasswordVault)
                    {
                        var cred = new Windows.Security.Credentials.PasswordCredential(AccessControlNamespace,
                                                                                       provider.ToString(), token);
                        new Windows.Security.Credentials.PasswordVault().Add(cred);
                    }
                    return new T()
                    {
                        Token = token, Success = true, Provider = provider
                    };
                }
                else
                {
                    return new T()
                    {
                        UnSuccessReason = response.ResponseStatus.ToString(),
                        Success = false, Provider = provider
                    }
                };
            }));
        }
Example #2
0
 public Task <Identity> IdentifyAsync(AuthenticationProvider provider, ACSProvider ACSProvider = null)
 {
     return(IdentifyAsync <Identity>(provider, ACSProvider));
 }