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 } }; })); }
public Task <Identity> IdentifyAsync(AuthenticationProvider provider, ACSProvider ACSProvider = null) { return(IdentifyAsync <Identity>(provider, ACSProvider)); }