Soacat iie1
View more presentations from jcastellsg.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TransparentProxy
{
interface IProxy<T>
T Client {get;}
void Close();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TransparentProxy
{
public class Proxy<T>: IProxy<T>
{
public T Client
{
get { throw new NotImplementedException(); }
}
public void Close()
{
throw new NotImplementedException();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Channels;
namespace TransparentProxy
{
public class Proxy<T>: IProxy<T>
{
ChannelFactory<T> ch;
public Proxy(Binding bind, string addr , string userName, string password )
{
ch = new ChannelFactory<T>(bind, new EndpointAddress(addr));
if ((userName != null) && (password!=null))
{
// És un exemple, les credencials poden ser passades
// d'altres maneres, certificats, tokens, etc.
// Cal docuementar-se.
ch.Credentials.UserName.UserName = userName;
ch.Credentials.UserName.Password = password;
}
}
public T Client
{
get { return ch.CreateChannel(); }
}
public void Close()
{
ch.Close();
}
}
}
WSHttpBinding bind=new WSHttpBinding(); bind.Security.Mode = SecurityMode.Message; bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; bind.Security.Message.ClientCredentialType = MessageCredentialType.Windows; bind.Security.Message.NegotiateServiceCredential = true; TransparentProxy.IProxyproxy = new TransparentProxy.Proxy (bind, "http://localhost:53538/WCFGAPService/Service.svc", null, null); IList res = proxy.Client.LListarMetges(); proxy.Close(); return res;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace ServeisDistribuits.Ingresos.ModulPrincipal
{
public class Servei:IModulPrincipal
{
public IList CercarPacient(CriteriCercarPacient criteri)
{
// Aqui podem fer una traça personalitzada d'entrada (usuari, PC, Hora, Missatge entrada....)
// Declarem la variable de retorn
IList llista = new List();
try
{
// Invoquem el negoci (GAP.dll) i
// omplim la llista i la retornem Ex: GAP.Search("Pacients",...
return llista;
}
catch (Exception e)
{
// Capturem l'error
// Fem una traça detallada Ex: Tracert(e)
// i finalment llacem un missatge al client
throw new FaultException(".... error .....");
}
}
public IList LListarMetges()
{
// Aqui podem fer una traça personalitzada d'entrada (usuari, PC, Hora, Missatge entrada....)
// Declarem la variable de retorn
IList llista = new List();
try
{
// Invoquem el negoci (GAP.dll) i
// omplim la llista i la retornem Ex: GAP.Search("Metges",...
return llista;
}
catch (Exception e)
{
// Capturem l'error
// Fem una traça detallada Ex: Tracert(e)
// i finalment llacem un missatge al client
throw new FaultException(".... error .....");
}
}
public IList LlistarLlits(LlitEstats estat)
{
// Aqui podem fer una traça personalitzada d'entrada (usuari, PC, Hora, Missatge entrada....)
// Declarem la variable de retorn
IList llista = new List();
try
{
// Invoquem el negoci (GAP.dll) i
// omplim la llista i la retornem Ex: GAP.Search("Llits",...
return llista;
}
catch (Exception e)
{
// Capturem l'error
// Fem una traça detallada Ex: Tracert(e)
// i finalment llacem un missatge al client
throw new FaultException(".... error .....");
}
}
public ResultatOperacio Ingresar(DadesIngres dades)
{
// Aqui podem fer una traça personalitzada d'entrada (usuari, PC, Hora, Missatge entrada....)
// Declarem la variable de retorn
ResultatOperacio resultat = null;
try
{
// Invoquem el negoci (GAP.dll) i
// Executem el negoci Ex: GAP.Save(dades
// i retornem el resultat.
return resultat;
}
catch (Exception e)
{
// Capturem l'error
// Fem una traça detallada Ex: Tracert(e)
// i finalment llacem un missatge al client
throw new FaultException(".... error .....");
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;
namespace ServeisDistribuits.Ingresos
{
[ServiceContract]
public interface IModulPrincipal
{
///
/// Trona una llista de pacients a partir d'un criteri de recerca
///
///
Criteri de recerca///
[OperationContract]
IList CercarPacient(CriteriCercarPacient criteri);
///
/// Retorna la llista de pacients actius
///
///
[OperationContract]
IList LListarMetges();
///
/// Retorna un llista de llits que cumpleixen un estat
///
///
///
[OperationContract]
IList LlistarLlits(LlitEstats estat);
///
/// Operació (Verb) que fa l'ingrés
///
///
Dades de l'ingrés///
[OperationContract]
ResultatOperacio Ingresar(DadesIngres dades);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
namespace ServeisDistribuits.Ingresos
{
///
/// Missatge que representa el criteri de recerca de Pacients
///
[DataContract]
public class CriteriCercarPacient
{
///
/// Part inicial del Cognom1
///
///
[DataMember]
public String Cognom1Comenca;
///
/// Part Inicial del cognom2
///
///
[DataMember]
public String Cognom2Comenca;
///
/// Part inicial del Nom
///
///
[DataMember]
public String NomComenca;
}
}
--------------------using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
namespace ServeisDistribuits.Ingresos
{
public class DadesIngres
{
[DataMember]
public String IdPacient;
[DataMember]
public String IdMetge;
[DataMember]
public String IdLlit;
[DataMember]
public String Observacions;
}
}
---------------------------using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
namespace ServeisDistribuits.Ingresos
{
[DataContract]
public class InformacioLlits
{
[DataMember]
public String Id;
[DataMember]
public EstatLlit Estat;
}
public enum EstatLlit
{
Buit=1,Ocupat=2
}
}
---------------------------using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
namespace ServeisDistribuits.Ingresos
{
[DataContract]
public class InformacioMetges
{
[DataMember]
public String Id;
[DataMember]
public String NomMetge;
}
}
---------------------------using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
namespace ServeisDistribuits.Ingresos
{
[DataContract]
public class InformacioPacient
{
[DataMember]
public String Id;
[DataMember]
public String NomPacient;
}
}
---------------------------using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ServeisDistribuits.Ingresos
{
public enum LlitEstats
{
Tots=0, Buits=1, Ocupats=2
}
}
---------------------------using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
namespace ServeisDistribuits.Ingresos
{
[DataContract]
public class ResultatOperacio
{
[DataMember] public String Missatge;
}
}
public string GetDataUserName()
{
//TODO: Change the code below to handle your claims usage.
IClaimsPrincipal principal = (IClaimsPrincipal)Thread.CurrentPrincipal;
IClaimsIdentity identity = (IClaimsIdentity)principal.Identity;
SecurityToken st = identity.BootstrapToken;
if (st == null)
{
st = principal.Identities[0].BootstrapToken;
}
string _sconf = "WS2007FederationHttpBinding_IService";
RequestSecurityTokenResponse _rsts = new RequestSecurityTokenResponse();
STSRPClient c2 = new STSRPClient(st, _sconf);
Back_End_Service.IServiceChannel cl2 = c2.ClientActAs;
string res1 = cl2.GetDataUserName();
cl2.Close();
return string.Format("Front_End_Service: tu ets {0}{1}{2}" , identity.Name, "\r\n" ,res1);
}
public string GetDataUserName()
{
//TODO: Change the code below to handle your claims usage.
IClaimsPrincipal principal = (IClaimsPrincipal)Thread.CurrentPrincipal;
IClaimsIdentity identity = (IClaimsIdentity)principal.Identity;
return string.Format("Back_End_Service: tu ets {0} i l'actor és {1}", identity.Name, identity.Actor.Name);
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IdentityModel.Tokens;
using System.ServiceModel;
using Microsoft.IdentityModel.Protocols.WSTrust;
using System.ServiceModel.Security;
namespace IDP
{
public static class EndPoints
{
public static string baseUri = "http://[idphost]/adfs/services/";
public static string SSLbaseUri = "https://[idphost]/adfs/services/";
public static SecurityToken GetTokenFrom_trust_13_usernamemixed(string username, string password, string appliesTo, out RequestSecurityTokenResponse rsts)
{
string adrecaSTS = "trust/13/usernamemixed";
WS2007HttpBinding binding = new WS2007HttpBinding();
binding.Security.Message.EstablishSecurityContext = false;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
binding.Security.Mode = SecurityMode.TransportWithMessageCredential; //https
WSTrustChannelFactory trustChannelFactory = new WSTrustChannelFactory(binding, new EndpointAddress(SSLbaseUri + adrecaSTS));
trustChannelFactory.TrustVersion = TrustVersion.WSTrust13;
trustChannelFactory.Credentials.UserName.UserName = username;
trustChannelFactory.Credentials.UserName.Password = password;
trustChannelFactory.ConfigureChannelFactory();
WSTrustChannel tokenClient = (WSTrustChannel)trustChannelFactory.CreateChannel();
//create a token issuance issuance
RequestSecurityToken rst = new RequestSecurityToken(WSTrust13Constants.RequestTypes.Issue);
//Relying Party’s identifier
rst.AppliesTo = new EndpointAddress(appliesTo);
//call ADFS STS
SecurityToken token = tokenClient.Issue(rst, out rsts);
return token;
}
public static SecurityToken GetTokenFrom_trust_13_windows(string appliesTo, out RequestSecurityTokenResponse rsts)
{
string adrecaSTS = "trust/13/windows";
WS2007HttpBinding binding = new WS2007HttpBinding();
binding.Security.Message.EstablishSecurityContext = false;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.NegotiateServiceCredential = true;
WSTrustChannelFactory trustChannelFactory = new WSTrustChannelFactory(binding, new EndpointAddress(baseUri + adrecaSTS));
trustChannelFactory.TrustVersion = TrustVersion.WSTrust13;
trustChannelFactory.ConfigureChannelFactory();
WSTrustChannel tokenClient = (WSTrustChannel)trustChannelFactory.CreateChannel();
//create a token issuance issuance
RequestSecurityToken rst = new RequestSecurityToken(WSTrust13Constants.RequestTypes.Issue);
//Relying Party’s identifier
rst.AppliesTo = new EndpointAddress(appliesTo);
//call ADFS STS
SecurityToken token = tokenClient.Issue(rst, out rsts);
return token;
}
}
}
Imports System.IdentityModel.Tokens
Imports System.ServiceModel
Imports System.ServiceModel.Description
Imports Microsoft.IdentityModel.Protocols.WSTrust
Imports System.ServiceModel.Channels
Imports System.ServiceModel.Security
Imports System.ServiceModel.Security.Tokens
Imports System.Text
Public Class STSRPClient(Of T)
Implements IDisposable
#Region "Members"
Private _st As SecurityToken
Private _factory As ChannelFactory(Of T)
#End Region
'''
''' Contructor per generar Client a partir del fitxer de configuració
'''
'''
'''
'''
Sub New(ByVal st As SecurityToken, ByVal bindingConfiguration As String)
Create(st, bindingConfiguration)
End Sub
Private Sub Create(ByVal st As SecurityToken, ByVal bindingconfiguration As String)
Me._st = st
_factory = New ChannelFactory(Of T)(bindingconfiguration)
_factory.ConfigureChannelFactory()
End Sub
Public Sub Close()
_factory.Close()
End Sub
Public ReadOnly Property Client As T
Get
Return _factory.CreateChannelWithIssuedToken(_st)
End Get
End Property
Public ReadOnly Property ClientActAs As T
Get
Return _factory.CreateChannelActingAs(_st)
End Get
End Property
#Region "IDisposable Support"
Private disposedValue As Boolean ' To detect redundant calls
' IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: dispose managed state (managed objects).
End If
If Me._factory.State <> CommunicationState.Closed Then
_factory.Close()
End If
_st = Nothing
' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
' TODO: set large fields to null.
End If
Me.disposedValue = True
End Sub
' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources.
'Protected Overrides Sub Finalize()
' ' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
' Dispose(False)
' MyBase.Finalize()
'End Sub
' This code added by Visual Basic to correctly implement the disposable pattern.
Public Sub Dispose() Implements IDisposable.Dispose
' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
End Class
Imports System.IdentityModel.Tokens
Imports Microsoft.IdentityModel.Protocols.WSTrust
Public Class Form1
Private Sub BInvoke_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BInvoke.Click
Dim adrecaservei As String = "http://localhost/Front_End_Service/Service.svc"
' App.config - Nom de la configuració del binding del client
Dim conf As String = "WS2007FederationHttpBinding_IService"
' Primer hem d'obtenir un token de seguretat del IDP pel servei
Dim rsts As New RequestSecurityTokenResponse
Dim st As SecurityToken = IDP.EndPoints.GetTokenFrom_trust_13_usernamemixed(Me.TxtUser.Text, Me.TxtPwd.Text, adrecaservei, rsts)
' Un cop el tenim em de fer-lo servir per accedir-hi i invocar les seves operacions
Dim clirp As New STS.STSRPClient(Of Front_End_Service.IServiceChannel)(st, conf)
Dim client As Front_End_Service.IServiceChannel = clirp.Client
Dim response As String = client.GetDataUserName()
clirp.Close()
clirp.Dispose()
Me.TextBox1.AppendText(response + vbNewLine)
End Sub
End Class
....
[ServiceContract]
public interface IService
{
[OperationContract]
string GetDataUserName();
}
....
using System.Threading;
using Microsoft.IdentityModel.Claims;
namespace Front_End_Service
{
public class Service : IService
{
public string GetDataUserName()
{
IClaimsPrincipal principal = (IClaimsPrincipal)Thread.CurrentPrincipal;
IClaimsIdentity identity = (IClaimsIdentity)principal.Identity;
return string.Format("Front_End_Service: tu ets {0}", identity.Name);
}
}
}
using System.Threading;
using Microsoft.IdentityModel.Claims;
namespace Back_End_Service
{
public class Service : IService
{
public string GetDataUserName()
{
IClaimsPrincipal principal = (IClaimsPrincipal)Thread.CurrentPrincipal;
IClaimsIdentity identity = (IClaimsIdentity)principal.Identity;
return string.Format("Back_End_Service: tu ets {0} i l'actor és {1}", identity.Name, identity.Actor.Name);
}
}
}