public static async Task LogoutSessionAsync(Configuration config, MASDevice device, MASUser user)
        {
            var url = config.GetEndpointPath(config.OAuth.SystemEndpoints.UserSessionLogout);

            HttpUrlBuilder builder = new HttpUrlBuilder();

            builder.Add("logout_apps", config.Mag.MobileSdk.IsSSOEnabled ? "true" : "false");
            builder.Add("id_token", user.IdToken);
            builder.Add("id_token_type", user.IdTokenType);

            var headers = new Dictionary <string, string>
            {
                { HttpHeaders.Authorization, device.AuthHeaderValue },
                { HttpHeaders.Accept, HttpContentTypes.Json },
                { "mag-identifier", device.MagId },
                { HttpHeaders.ContentType, HttpContentTypes.UrlEncoded }
            };

            await HttpRequestFactory.RequestAsync <HttpResponseBaseData>(new HttpRequestInfo()
            {
                Method  = HttpMethod.POST,
                Headers = headers,
                Url     = url,
                Body    = builder.ToString()
            });
        }
        public async Task <string> GenerateCSRAsync(Configuration config, MASDevice device, string username)
        {
            #region Bouncy castle CSR generation
            return(await Task.Run(() =>
            {
                X509Name subject = new X509Name(string.Format("cn={0}, ou={1}, dc={2}, o={3}", username, device.Id, device.Name, config.OAuth.Client.Organization));
                var keyGenerationParameters = new KeyGenerationParameters(_random, config.Mag.MobileSdk.ClientCertRsaKeybits);

                var keyPairGenerator = new RsaKeyPairGenerator();
                keyPairGenerator.Init(keyGenerationParameters);
                var subjectKeyPair = keyPairGenerator.GenerateKeyPair();

                Pkcs10CertificationRequest request = new Pkcs10CertificationRequest(new Asn1SignatureFactory("SHA256WithRSA", subjectKeyPair.Private),
                                                                                    subject, subjectKeyPair.Public, new DerSet(), subjectKeyPair.Private);

                var data = request.GetEncoded();

                _privateKey = subjectKeyPair.Private;
                return Convert.ToBase64String(data);
            }));

            #endregion

            // MSFT way of generating the CSR
            //return await CertificateEnrollmentManager.CreateRequestAsync(new CertificateRequestProperties()
            //{
            //    KeySize = (uint)config.Mag.MobileSdk.ClientCertRsaKeybits,
            //    Subject = string.Format("cn={0}, ou={1}, dc={2}, o={3}", username, device.Id.GetHashCode(), device.Name, config.OAuth.Client.Organization),
            //    KeyUsages = EnrollKeyUsages.Decryption | EnrollKeyUsages.Signing
            //});
        }
        public static async Task RevokeAccessTokenAsync(Configuration config, MASDevice device, MASUser user)
        {
            var url = config.GetEndpointPath(config.OAuth.SystemEndpoints.TokenRevocation);

            var accessToken = await user.GetAccessTokenAsync();

            HttpUrlBuilder builder = new HttpUrlBuilder(url);

            builder.Add("token", accessToken);
            builder.Add("token_type_hint", "access_token");

            var headers = new Dictionary <string, string>
            {
                { HttpHeaders.Authorization, device.AuthHeaderValue },
                { HttpHeaders.Accept, HttpContentTypes.Json }
            };

            await HttpRequestFactory.RequestAsync <HttpResponseBaseData>(new HttpRequestInfo()
            {
                Method  = HttpMethod.DELETE,
                Headers = headers,
                Url     = builder.ToString(),
            });
        }
        public static async Task <RegisterResponseData> RegisterDeviceForUserAsync(Configuration config, MASDevice device, string username, string password, string csr)
        {
            var url = config.GetEndpointPath(config.Mag.SystemEndpoints.DeviceRegister);

            var headers = new Dictionary <string, string>
            {
                { "client-authorization", device.AuthHeaderValue },
                { HttpHeaders.Authorization, string.Format("Basic {0}", string.Format("{0}:{1}", username, password).ToBase64()) },
                { "device-id", device.Id.ToBase64() },
                { "device-name", device.Name.ToBase64() },
                { "cert-format", "base64" },
                { "create-session", "true" },
                { HttpHeaders.ContentType, HttpContentTypes.Plain },
                { HttpHeaders.Accept, HttpContentTypes.Plain }
            };

            return(await HttpRequestFactory.RequestAsync <RegisterResponseData>(new HttpRequestInfo()
            {
                Method = HttpMethod.POST,
                Url = url,
                Headers = headers,
                Body = csr
            }));
        }
        public static async Task <AuthorizationProvidersResponseData> GetAuthorizationProviders(Configuration config, MASDevice device)
        {
            var url = config.GetEndpointPath(config.OAuth.SystemEndpoints.Authorization);

            var scope = config.DefaultClientId.Scope;

            var urlBuilder = new HttpUrlBuilder(url);

            urlBuilder.Add("client_id", device.ClientId);
            urlBuilder.Add("redirect_uri", "");
            urlBuilder.Add("scope", scope);
            urlBuilder.Add("response_type", "code");
            urlBuilder.Add("display", "social_login");

            var headers = new Dictionary <string, string>
            {
                { HttpHeaders.Accept, HttpContentTypes.Json }
            };

            return(await HttpRequestFactory.RequestAsync <AuthorizationProvidersResponseData>(new HttpRequestInfo()
            {
                Method = HttpMethod.GET,
                Url = urlBuilder.ToString(),
                Headers = headers,
            }));
        }
        public static async Task <UserInfoResponseData> GetUserInfoAsync(Configuration config, MASDevice device, MASUser user)
        {
            var url = config.GetEndpointPath(config.OAuth.ProjectedEndpoints.UserInfo);

            var accessTokenHeaderValue = await user.GetAccessHeaderValueAsync();

            var headers = new Dictionary <string, string>
            {
                { HttpHeaders.Authorization, accessTokenHeaderValue },
                { "mag-identifier", device.MagId },
                { HttpHeaders.Accept, HttpContentTypes.Json }
            };

            return(await HttpRequestFactory.RequestAsync <UserInfoResponseData>(new HttpRequestInfo()
            {
                Url = url,
                Method = HttpMethod.GET,
                Headers = headers
            }));
        }
        public static Task <RequestTokenResponseData> RefreshAccessTokenAsync(Configuration config, MASDevice device, string refreshToken)
        {
            var url     = config.GetEndpointPath(config.OAuth.SystemEndpoints.Token);
            var headers = new Dictionary <string, string>
            {
                { HttpHeaders.Authorization, device.AuthHeaderValue },
                { "mag-identifier", device.MagId },
                { HttpHeaders.ContentType, HttpContentTypes.UrlEncoded },
                { HttpHeaders.Accept, HttpContentTypes.Json }
            };

            var scope = config.DefaultClientId.Scope;

            var builder = new HttpUrlBuilder();

            builder.Add("scope", scope);
            builder.Add("refresh_token", refreshToken);
            builder.Add("grant_type", "refresh_token");

            return(HttpRequestFactory.RequestAsync <RequestTokenResponseData>(new HttpRequestInfo()
            {
                Method = HttpMethod.POST,
                Url = url,
                Headers = headers,
                Body = builder.ToString()
            }));
        }
        public static Task <RequestTokenResponseData> RequestAccessTokenAnonymouslyAsync(Configuration config, MASDevice device)
        {
            var url = config.GetEndpointPath(config.OAuth.SystemEndpoints.Token);

            var headers = new Dictionary <string, string>
            {
                { HttpHeaders.Authorization, device.AuthHeaderValue },
                { "mag-identifier", device.MagId },
                { HttpHeaders.ContentType, HttpContentTypes.UrlEncoded },
                { HttpHeaders.Accept, HttpContentTypes.Json }
            };

            var scope = config.DefaultClientId.Scope;

            var builder = new HttpUrlBuilder();

            builder.Add("scope", "openid msso phone profile address email");
            //builder.Add("client_id", device.ClientId);
            //builder.Add("client_secret", device.ClientSecret);
            builder.Add("grant_type", "client_credentials");

            return(HttpRequestFactory.RequestAsync <RequestTokenResponseData>(new HttpRequestInfo()
            {
                Method = HttpMethod.POST,
                Url = url,
                Headers = headers,
                Body = builder.ToString()
            }));
        }
        public static Task <UnregisterResponseData> UnregisterDevice(Configuration config, MASDevice device)
        {
            var url = config.GetEndpointPath(config.Mag.SystemEndpoints.DeviceRemove);

            return(HttpRequestFactory.RequestAsync <UnregisterResponseData>(new HttpRequestInfo()
            {
                Method = HttpMethod.DELETE,
                Url = url,
                Certificate = device.Certificate
            }));
        }