/// <summary>
        /// Gets current credentials
        /// </summary>
        private IDisposable GetCredentials(IRestClient client, out Credentials credentials)
        {
            var retVal = AuthenticationContextExtensions.EnterDeviceContext();

            credentials = client.Description.Binding.Security.CredentialProvider.GetCredentials(AuthenticationContext.Current.Principal);
            return(retVal);
        }
        /// <summary>
        /// Get a service client
        /// </summary>
        protected AmiServiceClient GetClient(IPrincipal principal = null)
        {
            var retVal = new AmiServiceClient(ApplicationContext.Current.GetRestClient("ami"));

            if (principal == null)
            {
                principal = AuthenticationContext.Current.Principal;
            }

            // Don't allow anonymous principals
            if (!principal.Identity.IsAuthenticated ||
                principal == AuthenticationContext.SystemPrincipal ||
                principal == AuthenticationContext.AnonymousPrincipal)
            {
                using (AuthenticationContextExtensions.TryEnterDeviceContext())
                {
                    retVal.Client.Credentials = retVal.Client.Description.Binding.Security.CredentialProvider.GetCredentials(AuthenticationContext.Current.Principal);
                }
            }
            else
            {
                retVal.Client.Credentials = retVal.Client.Description.Binding.Security.CredentialProvider.GetCredentials(principal);
            }
            return(retVal);
        }
示例#3
0
        /// <summary>
        /// Gets current credentials
        /// </summary>
        private IDisposable Authenticate(IRestClient client, out Credentials credentials)
        {
            var appConfig = ApplicationContext.Current.Configuration.GetSection <SecurityConfigurationSection>();
            var retVal    = AuthenticationContextExtensions.TryEnterDeviceContext();

            credentials = client.Description.Binding.Security.CredentialProvider.GetCredentials(AuthenticationContext.Current.Principal);
            return(retVal);
        }
 /// <summary>
 /// Gets current credentials
 /// </summary>
 private Credentials GetCredentials(IRestClient client)
 {
     try
     {
         using (AuthenticationContextExtensions.EnterDeviceContext())
         {
             return(client.Description.Binding.Security.CredentialProvider.GetCredentials(AuthenticationContext.Current.Principal));
         }
     }
     catch (Exception)
     {
         return(null);
     }
 }
 /// <summary>
 /// Gets current credentials
 /// </summary>
 private Credentials GetCredentials(IRestClient client)
 {
     try
     {
         using (AuthenticationContextExtensions.EnterDeviceContext())
         {
             return(client.Description.Binding.Security.CredentialProvider.GetCredentials(AuthenticationContext.Current.Principal));
         }
     }
     catch (Exception e)
     {
         this.m_tracer.TraceError("Error authentication for synchronization: {0}", e);
         throw new SecurityException("Error authenticating for synchronization. Perhaps the device has been reconfigured?", e);
     }
 }
示例#6
0
        /// <summary>
        /// Serialize the reply
        /// </summary>
        public override void SerializeResponse(RestResponseMessage response, object[] parameters, object result)
        {
            try
            {
                // Outbound control
                var    httpRequest = RestOperationContext.Current.IncomingRequest;
                string accepts     = httpRequest.Headers["Accept"]?.ToLower(),
                       contentType = httpRequest.Headers["Content-Type"]?.ToLower();

                // The request was in JSON or the accept is JSON
                if (result is Stream) // TODO: This is messy, clean it up
                {
                    contentType   = "application/octet-stream";
                    response.Body = result as Stream;
                }
                else if (accepts?.StartsWith("application/json+sdb-viewmodel") == true &&
                         typeof(IdentifiedData).IsAssignableFrom(result?.GetType()))
                {
                    var viewModel = httpRequest.Headers["X-SanteDB-ViewModel"] ?? httpRequest.QueryString["_viewModel"];

                    // Create the view model serializer
                    using (AuthenticationContextExtensions.TryEnterDeviceContext())
                    {
                        var viewModelSerializer = new JsonViewModelSerializer();
                        viewModelSerializer.LoadSerializerAssembly(typeof(ActExtensionViewModelSerializer).Assembly);

                        if (!String.IsNullOrEmpty(viewModel))
                        {
                            var viewModelDescription = ApplicationContext.Current.GetService <IAppletManagerService>()?.Applets.GetViewModelDescription(viewModel);
                            viewModelSerializer.ViewModel = viewModelDescription;
                        }
                        else
                        {
                            viewModelSerializer.ViewModel = m_defaultViewModel;
                        }

                        using (var tms = new MemoryStream())
                            using (StreamWriter sw = new StreamWriter(tms, Encoding.UTF8))
                                using (JsonWriter jsw = new JsonTextWriter(sw))
                                {
                                    viewModelSerializer.Serialize(jsw, result as IdentifiedData);
                                    jsw.Flush();
                                    sw.Flush();
                                    response.Body = new MemoryStream(tms.ToArray());
                                }
                    }
                    contentType = "application/json+sdb-viewModel";
                }
                // The request was in XML and/or the accept is JSON
                else if ((accepts?.StartsWith("application/xml") == true ||
                          contentType?.StartsWith("application/xml") == true) &&
                         result?.GetType().GetCustomAttribute <XmlTypeAttribute>() != null)
                {
                    XmlSerializer xsz = XmlModelSerializerFactory.Current.CreateSerializer(result.GetType());
                    MemoryStream  ms  = new MemoryStream();
                    xsz.Serialize(ms, result);
                    contentType = "application/xml";
                    ms.Seek(0, SeekOrigin.Begin);
                    response.Body = ms;
                }
                else if (result is XmlSchema)
                {
                    MemoryStream ms = new MemoryStream();
                    (result as XmlSchema).Write(ms);
                    ms.Seek(0, SeekOrigin.Begin);
                    contentType   = "text/xml";
                    response.Body = ms;
                }
                else if (result != null)
                {
                    // Prepare the serializer
                    JsonSerializer jsz = new JsonSerializer();
                    jsz.Converters.Add(new StringEnumConverter());

                    // Write json data
                    using (MemoryStream ms = new MemoryStream())
                        using (StreamWriter sw = new StreamWriter(ms, Encoding.UTF8))
                            using (JsonWriter jsw = new JsonTextWriter(sw))
                            {
                                jsz.DateFormatHandling    = DateFormatHandling.IsoDateFormat;
                                jsz.NullValueHandling     = NullValueHandling.Ignore;
                                jsz.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                                jsz.TypeNameHandling      = TypeNameHandling.Auto;
                                jsz.Converters.Add(new StringEnumConverter());
                                jsz.Serialize(jsw, result);
                                jsw.Flush();
                                sw.Flush();
                                response.Body = new MemoryStream(ms.ToArray());
                            }

                    // Prepare reply for the WCF pipeline
                    contentType = "application/json";
                }
                else if (response.StatusCode == 0)
                {
                    response.StatusCode = 204; // no content
                }
                RestOperationContext.Current.OutgoingResponse.ContentType = RestOperationContext.Current.OutgoingResponse.ContentType ?? contentType;
            }
            catch (Exception e)
            {
                this.m_traceSource.TraceError("Error Serializing Dispatch Reply: {0}", e.ToString());
                new AgsErrorHandlerServiceBehavior().ProvideFault(e, response);
            }
        }