protected IHttpActionResult GetHttpMsgWithRedirect(string url, string errMsg = null)
        {
            if (string.IsNullOrEmpty(url))
            {
                return(CreateResponse(MobileConnectStatus.Error(ErrorCodes.InvalidArgument, errMsg, new Exception())));
            }

            var authResponse = Request.CreateResponse(HttpStatusCode.Redirect);

            authResponse.Headers.Location = new Uri(url);

            return(new ResponseMessageResult(authResponse));
        }
        public void ResponseConverterShouldHandleErrorStatus()
        {
            var error       = "this is the error";
            var description = "this is the description";
            var status      = MobileConnectStatus.Error(error, description, null);

            var actual = ResponseConverter.Convert(status);

            Assert.IsNotNull(actual);
            Assert.AreEqual("failure", actual.Status);
            Assert.AreEqual("error", actual.Action);
            Assert.AreEqual(error, actual.Error);
            Assert.AreEqual(description, actual.Description);
        }
        public async Task <IHttpActionResult> DiscoveryCallback(
            string state             = null,
            string error             = null,
            string error_description = null,
            string description       = null)
        {
            if (!string.IsNullOrEmpty(error))
            {
                return(CreateResponse(MobileConnectStatus.Error(error, error_description != null ? error_description : description, new Exception())));
            }

            var options = new MobileConnectRequestOptions
            {
                AcceptedValidationResults = Authentication.TokenValidationResult.Valid |
                                            Authentication.TokenValidationResult.IdTokenValidationSkipped,
                Context        = ApiVersion.Equals(Utils.Constants.VERSION2_0) || ApiVersion.Equals(Utils.Constants.VERSION2_3) ? Utils.Constants.ContextBindingMsg : null,
                BindingMessage = ApiVersion.Equals(Utils.Constants.VERSION2_0) || ApiVersion.Equals(Utils.Constants.VERSION2_3) ? Utils.Constants.ContextBindingMsg : null,
                ClientName     = OperatorParams.clientName,
                AcrValues      = OperatorParams.acrValues
            };

            Uri requestUri = Request.RequestUri;

            SessionData sessionData = SessionCache.Get(state);

            MobileConnectStatus status = await MobileConnect.HandleUrlRedirectAsync(Request, requestUri, sessionData.DiscoveryResponse,
                                                                                    state, sessionData.Nonce, options, ApiVersion);


            var idTokenResponseModel =
                JsonConvert.DeserializeObject <IdTokenResponse>(status.TokenResponse.DecodedIdTokenPayload);


            MobileConnectStatus response = null;

            if (idTokenResponseModel.nonce.Equals(sessionData.Nonce))
            {
                if (ApiVersion.Equals(Utils.Constants.VERSION1_1) &
                    !string.IsNullOrEmpty(sessionData.DiscoveryResponse.OperatorUrls.UserInfoUrl))
                {
                    for (int scopeIndex = 0; scopeIndex < UserInfoScopes.Length; scopeIndex++)
                    {
                        if (OperatorParams.scope.Contains(UserInfoScopes[scopeIndex]))
                        {
                            response = await RequestUserInfo(sessionData.DiscoveryResponse,
                                                             status.TokenResponse.ResponseData.AccessToken);

                            return(CreateIdentityResponse(status, response));
                        }
                    }
                }

                if ((ApiVersion.Equals(Utils.Constants.VERSION2_0) || ApiVersion.Equals(Utils.Constants.VERSION2_3)) &
                    !string.IsNullOrEmpty(sessionData.DiscoveryResponse.OperatorUrls.PremiumInfoUrl))
                {
                    for (int scopeIndex = 0; scopeIndex < IdentityScopes.Length; scopeIndex++)
                    {
                        if (OperatorParams.scope.Contains(IdentityScopes[scopeIndex]))
                        {
                            response = await RequestPremiumInfo(sessionData.DiscoveryResponse,
                                                                status.TokenResponse.ResponseData.AccessToken);

                            return(CreateIdentityResponse(status, response));
                        }
                    }
                }
            }
            else
            {
                response = MobileConnectStatus.Error(
                    ErrorCodes.InvalidArgument, "nonce is incorrect", new Exception());
                return(CreateResponse(response));
            }

            // return CreateResponse(status);
            return(CreateIdentityResponse(status));
        }