From 8b80d6c1270d34dea6d1a8a6df8c8a7198b688f3 Mon Sep 17 00:00:00 2001 From: rrene Date: Fri, 24 Jul 2020 18:50:28 -0700 Subject: [PATCH 01/23] -ajustes de secciones --- Inventarios/Apartados.aspx.vb | 2 +- Inventarios/EntregaAlmacen.aspx | 44 +++++++++++++-------------- Inventarios/EntregaAlmacen.aspx.vb | 2 +- Inventarios/Kardex.aspx.vb | 4 +-- Inventarios/ResguardoMaterial.aspx | 2 +- Inventarios/ResguardoMaterial.aspx.vb | 29 +++++++++++++++--- Ventas/ProductosServicios.aspx | 2 +- Ventas/ProductosServicios.aspx.vb | 13 +++++--- 8 files changed, 61 insertions(+), 37 deletions(-) diff --git a/Inventarios/Apartados.aspx.vb b/Inventarios/Apartados.aspx.vb index 21708ab8a..6853eb7ec 100644 --- a/Inventarios/Apartados.aspx.vb +++ b/Inventarios/Apartados.aspx.vb @@ -836,7 +836,7 @@ Partial Class Inventarios_Apartados GvDatosDesapartado.Columns(5).Visible = DtTemp.MAX("Serie").ToString <> "" GvDatosDesapartado.Columns(6).Visible = DtTemp.MAX("Lote").ToString <> "" GvDatosDesapartado.Columns(7).Visible = DtTemp.MAX("FechaCaducidad").ToString.ToDate > MinFecha - GvDatosDesapartado.Columns(8).Visible = DtTemp.MAX("CveSeccionAlmacen").ToString.ToEntero > 0 + GvDatosDesapartado.Columns(8).Visible = DtTemp.MAX("AplicaSeccion") = "True" GvDatosDesapartado.DataSource = DtTemp GvDatosDesapartado.DataBind() diff --git a/Inventarios/EntregaAlmacen.aspx b/Inventarios/EntregaAlmacen.aspx index 2c2378d3e..8d4ff3ea1 100644 --- a/Inventarios/EntregaAlmacen.aspx +++ b/Inventarios/EntregaAlmacen.aspx @@ -21,20 +21,22 @@ } .gvInventario tr td:nth-child(4) { - width: 18% !important; + width: 12% !important; text-align: center !important; } .gvInventario tr th:nth-child(4) { - width: 18% !important; + width: 12% !important; } .gvEscondeColumna tr td:nth-child(3) { display: none; + width:0px; } .gvEscondeColumna tr th:nth-child(3) { display: none; + width:0px; } .btn.default:hover { @@ -406,6 +408,12 @@
+ +
+
+ +
+
@@ -429,40 +437,32 @@ -
-
-
- -
-
-
- + <%--GV DATOS--%> - + DataKeyNames="Consec,CvePS,Codigo,CodigoBarras,AplicaSerieLote,CveUM,CantidadC,CantidadF,UM,PS,CveClasificacion,CveVentaDetalle,CveTamaño,AplicaSeccion, AplicaSerie,AplicaLote,AplicaCaducidad" HeaderStyle-CssClass="Titulos" CssClass="table table-striped table-hover Widthall ScrollAD gvInventario mysmallbtn" data-heighterror="450" data-freezerows="1" GridLines="None"> + - + - + - - + + - + - - + - - + + - + diff --git a/Inventarios/EntregaAlmacen.aspx.vb b/Inventarios/EntregaAlmacen.aspx.vb index 1fda0e0ee..c4b208c08 100644 --- a/Inventarios/EntregaAlmacen.aspx.vb +++ b/Inventarios/EntregaAlmacen.aspx.vb @@ -927,7 +927,7 @@ Partial Class Inventarios_EntregaAlmacen If e.Row.DBCampo("Inv_CveMetodoInventario").Contiene("5", "6") Then e.Row.FCTextBox("TbCantidadF").Enabled = False Else - e.Row.FCTextBox("TbCantidadF").Text = e.Row.DBCampo("CantidadF").FormatoNumero() + e.Row.FCTextBox("TbCantidadF").Text = e.Row.DBCampo("CantidadF").ToDecimal.ToString("#,##0.######") End If End If diff --git a/Inventarios/Kardex.aspx.vb b/Inventarios/Kardex.aspx.vb index 67eba9064..6cafe91de 100644 --- a/Inventarios/Kardex.aspx.vb +++ b/Inventarios/Kardex.aspx.vb @@ -168,9 +168,9 @@ Partial Class Inventarios_Kardex TxtSerie.Text = "" If ddlProducto2.SelectedValue.ToEntero > 0 Then - Dim Dr As DataRow = GlobalDTPS(UsuarioActual.CveEmpresa, ddlProducto2.SelectedValue.ToEntero).FiltroPrimero("") + Dim Dr As DataRow = GlobalDTPSSimplificado(UsuarioActual.CveEmpresa, CvePS:=ddlProducto2.SelectedValue.ToEntero).FiltroPrimero("") If Dr IsNot Nothing Then - If Dr("Inv_CveMetodoInventario").ToString.ToEntero = 5 Then + If Dr("AplicaSerie").ToString = "True" Then DivSerie.Visible = True Else DivSerie.Visible = False diff --git a/Inventarios/ResguardoMaterial.aspx b/Inventarios/ResguardoMaterial.aspx index 688c514df..939bb9015 100644 --- a/Inventarios/ResguardoMaterial.aspx +++ b/Inventarios/ResguardoMaterial.aspx @@ -242,7 +242,7 @@ diff --git a/Inventarios/ResguardoMaterial.aspx.vb b/Inventarios/ResguardoMaterial.aspx.vb index c706e4f5c..0df638679 100644 --- a/Inventarios/ResguardoMaterial.aspx.vb +++ b/Inventarios/ResguardoMaterial.aspx.vb @@ -275,8 +275,8 @@ Partial Class Inventarios_ResguardoMaterial DdlAlmacenDestinoLiberacion.DataBind() DdlAlmacenDestinoLiberacion.Items.Insert(0, New ListItem("Seleccione", "-1")) - DdlSeccionAlmacen.DataSource = GlobalDTSeccionAlmacen(UsuarioActual.CveEmpresa, -1) - DdlSeccionAlmacen.DataBind() + 'DdlSeccionAlmacen.DataSource = GlobalDTSeccionAlmacen(UsuarioActual.CveEmpresa, -1) + 'DdlSeccionAlmacen.DataBind() CargaPS() End Sub @@ -335,9 +335,11 @@ Partial Class Inventarios_ResguardoMaterial End Sub Private Sub VerificaProducto() If DdlProducto2.SelectedValue.ToEntero > 0 Then - Dim drp As DataRow = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=DdlProducto2.SelectedValue.ToEntero).FiltroPrimero("") + Dim drp As DataRow = GlobalDTPSSimplificado(UsuarioActual.CveEmpresa, CvePS:=DdlProducto2.SelectedValue.ToEntero).FiltroPrimero("") If drp IsNot Nothing Then + + 'activa Serie If CBool(drp("AplicaSerie")) Then ThSerie.Visible = True @@ -349,6 +351,16 @@ Partial Class Inventarios_ResguardoMaterial If CBool(drp("AplicaSeccion")) Then ThSeccion.Visible = True TrSeccion.Visible = True + If DdlAlmacen.SelectedValue.ToEntero > 0 Then + DdlSeccionAlmacen.Items.Clear() + Dim dtt As DataTable = GlobalDTInvPSSeccionesAlmacen(UsuarioActual.CveEmpresa, DdlAlmacen.SelectedValue.ToEntero, DdlProducto2.SelectedValue.ToEntero) + DdlSeccionAlmacen.DataSource = dtt + DdlSeccionAlmacen.DataBind() + If dtt.Rows.Count > 1 Then + DdlSeccionAlmacen.Items.Insert(0, New ListItem("Seleccione", "-1")) + End If + dtt.Dispose() + End If End If 'activa lote If CBool(drp("AplicaLote")) Then @@ -445,7 +457,7 @@ Partial Class Inventarios_ResguardoMaterial registro.Item("Estatus") = "" registro.Item("SeccionAlmacen") = If(DdlSeccionAlmacen.SelectedValue.ToEntero > 0, DdlSeccionAlmacen.SelectedItem.Text, "") registro.Item("Serie") = TxtnSerie.Text - registro.Item("Lote") = If(TxtLote.Text = "", "-1", TxtLote.Text) + registro.Item("Lote") = If(TxtLote.Text = "", "", TxtLote.Text) registro.Item("FechaCaducidad") = If(TxtCaducidad.Text = "", MinFecha.ToString, TxtCaducidad.Text) registro.Item("CveSeccionAlmacen") = If(DdlSeccionAlmacen.SelectedValue.ToEntero > 0, DdlSeccionAlmacen.SelectedValue.ToEntero, -1) registro.Item("Observaciones") = TxtObservacionesdetalle.Text @@ -823,10 +835,17 @@ Partial Class Inventarios_ResguardoMaterial MensajeError = "Ocurrió un error al guardar el movimiento de entrada correctamente. Por favor vuelva a intentar." TieneError = True Else + If ObjInventario.GetMovimientosDetalle(CveMovimientoSalida, UsuarioActual.CveEmpresa) Then + Dim CveSeccionAlmacen As Integer = 0 For Each Dr As DataRow In ObjInventario.DtResultados.Rows + If CBool(Dr("AplicaSeccion")) Then + CveSeccionAlmacen = GlobalDTInvPSSeccionesAlmacen(UsuarioActual.CveEmpresa, DdlAlmacenDestino.SelectedValue.ToEntero, Dr("CvePS").ToString.ToEntero).FiltroPrimeroValor("CveSeccionAlmacen").ToEntero + Else + CveSeccionAlmacen = -1 + End If If Not ObjInventario.AddMovimientoDetalle(CveMovimientoEntrada, Dr("Cantidad").ToString.ToDouble, Dr("CveUM").ToString.ToEntero, Dr("CvePS").ToString.ToEntero, - Dr("PU").ToString.ToDecimal, Dr("CveAF").ToString.ToEntero, CveSeccionAlmacen:=Dr("CveSeccionAlmacen").ToString.ToEntero, + Dr("PU").ToString.ToDecimal, Dr("CveAF").ToString.ToEntero, CveSeccionAlmacen:=CveSeccionAlmacen, Serie:=Dr("Serie").ToString, Observaciones:=Dr("Observaciones").ToString) Then TieneError = True MensajeError = "Ocurrió un error al guardar los movimientos de entrada" diff --git a/Ventas/ProductosServicios.aspx b/Ventas/ProductosServicios.aspx index 36274682c..075222523 100644 --- a/Ventas/ProductosServicios.aspx +++ b/Ventas/ProductosServicios.aspx @@ -2072,7 +2072,7 @@ + + +
+
+
+ + + +
+
+ +
+ +
@@ -153,6 +153,7 @@
- +
Almacén Destino: - +
+ + + + + +
Estado :
Usuario :
Fecha :
+ +
+ +
+ +
+ + +
+ +
+
+ +
+ +
+ + + + + + + + + + + + @@ -238,7 +300,7 @@
- + diff --git a/Inventarios/TrasladoSolicitud.aspx.vb b/Inventarios/TrasladoSolicitud.aspx.vb index 515063e12..6c3b28afe 100644 --- a/Inventarios/TrasladoSolicitud.aspx.vb +++ b/Inventarios/TrasladoSolicitud.aspx.vb @@ -35,9 +35,24 @@ Partial Class Inventarios_TrasladoSolicitud Set(value As Integer) ViewState("CveDireccionEnvio") = value End Set - End Property + End Property + + 'Private Property CveUsuarioAutoriza As Integer + ' Get + ' If ViewState("CveUsuarioAutoriza") Is Nothing Then + ' Return -1 + ' Else + ' Return CType(ViewState("CveUsuarioAutoriza"), Integer) + ' End If + + ' End Get + ' Set(value As Integer) + ' ViewState("CveUsuarioAutoriza") = value + ' End Set + 'End Property + #End Region - + Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load If Not IsPostBack Then @@ -132,7 +147,8 @@ Partial Class Inventarios_TrasladoSolicitud #Region " CARGA DATOS " Private Sub CargaDatos() Dim ObjInventarios As New ClsInventarios - Dim ObjClientes As New ClsClientes + Dim ObjClientes As New ClsClientes + If ObjInventarios.AddTrasladoSolicitudGet(CveTraspasoSolicitud, UsuarioActual.CveEmpresa) Then If ObjInventarios.DtResultados.Rows.Count > 0 Then @@ -213,6 +229,55 @@ Partial Class Inventarios_TrasladoSolicitud LbAgregarPS.Visible = False HLDesdeContrato.Visible = False + + Dim EstatusAlmacen As Integer = ObjInventarios.DtResultados.Rows(0)("EstatusAlmacen").ToString().ToEntero + Dim CveUsuarioAutoriza As Integer = ObjInventarios.DtResultados.Rows(0)("CveUsuarioAutorizaDestino").ToString().ToEntero + + If EstatusAlmacen > 0 Then + + + If UsuarioActual.CveUsuario = CveUsuarioAutoriza Then + + If EstatusAlmacen = 1 Then + + + DivAutoriza.Visible = True + DVAutorizarBotones.Visible = True + DVAutorizaInformacion.Visible = False + + ElseIf EstatusAlmacen.Contiene(2, 3) Then + DivAutoriza.Visible = True + + DVAutorizarBotones.Visible = False + DVAutorizaInformacion.Visible = True + + LblEstatusAutorizo.Text = If(EstatusAlmacen = 2, "Aceptado", "Rechazado") + LblUsaurioAutorizo.Text = ObjInventarios.DtResultados.Rows(0)("NombreAutoriza").ToString() + LblFechaAutoriza.Text = ObjInventarios.DtResultados.Rows(0)("FechaAutorizacion").ToString().ToDate().ToString("dd/MM/yyyy") + Else + + End If + + ElseIf EstatusAlmacen.Contiene(2, 3) Then + + DivAutoriza.Visible = True + + DVAutorizarBotones.Visible = False + DVAutorizaInformacion.Visible = True + + LblEstatusAutorizo.Text = If(EstatusAlmacen = 2, "Aceptado", "Rechazado") + LblUsaurioAutorizo.Text = ObjInventarios.DtResultados.Rows(0)("NombreAutoriza").ToString() + LblFechaAutoriza.Text = ObjInventarios.DtResultados.Rows(0)("FechaAutorizacion").ToString().ToDate().ToString("dd/MM/yyyy") + + End If + + + Else + DivAutoriza.Visible = False + End If + + + Else Alert("Ocurrió un error al obtener los datos del traspaso.", TipoMensaje.MsgError) End If @@ -469,15 +534,37 @@ Partial Class Inventarios_TrasladoSolicitud If Not GvDatos.Rows.Count > 0 Then Alert("No se ha seleccionado ningún Producto para trasladar.", TipoMensaje.MsgAdvertencia) Exit Sub - End If - - 'VERIFICA EXISTENCIAS + End If + + + Dim CveUsuarioAutoriza As Integer = -1 + Dim EstatusAlmacen As Integer = 2 + 'VERIFICA EXISTENCIAS Dim ObjInventarios As New ClsInventarios Dim Existencia = 0.0 Dim TieneErrorExistencia = False Dim MensajeExistencia As New StringBuilder MensajeExistencia.Append("No hay la existencia suficiente de los siguientes productos:
") - Dim CodigoPS As String = "" + Dim CodigoPS As String = "" + + + If ObjInventarios.GetAlmacenes(-1, -1, UsuarioActual.CveEmpresa, -1) Then + + If ObjInventarios.DtResultados.Rows.Count > 0 Then + + CveUsuarioAutoriza = If(ObjInventarios.DtResultados.FiltraParametros($"CveAlmacen = {DdlAlmacenDestino.SelectedValue}")(0)("CveUsuarioAutoriza").ToString.ToEntero > 0, ObjInventarios.DtResultados.FiltraParametros($"CveAlmacen = {DdlAlmacenDestino.SelectedValue}")(0)("CveUsuarioAutoriza").ToString.ToEntero, -1) + If CveUsuarioAutoriza > 0 Then + EstatusAlmacen = 1 + End If + + Else + CveUsuarioAutoriza = -1 + End If + End If + + + + For Each row As GridViewRow In GvDatos.Rows CodigoPS = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=row.DataKey("CvePS").ToEntero).FiltroPrimeroValor("PSCodigo", "") Existencia = ObjInventarios.GetExistenciasPS(row.DataKey("CvePS").ToEntero, row.DataKey("CveUM").ToEntero, UsuarioActual.CveEmpresa, DdlAlmacenOrigen.SelectedValue.ToEntero, FechaMovto:=TxtFecha.Text.ToDate.ToString("yyyy/MM/dd 23:59")) @@ -509,7 +596,7 @@ Partial Class Inventarios_TrasladoSolicitud Estatus = 3 End If - Dim Folio = ObjInventarios.AddTrasladoSolicitud(TxtObservaciones.Text.Trim, DdlAlmacenOrigen.SelectedValue.ToEntero, DdlAlmacenDestino.SelectedValue.ToEntero, Estatus, -1, TxtFecha.Text.ToDate, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, CveContrato:=CveContrato, Guia:=Guia, CvePaqueteria:=DdlPaqueteria.SelectedValue.ToEntero, CveDireccionEnvio:=CveDireccionEnvio) + Dim Folio = ObjInventarios.AddTrasladoSolicitud(TxtObservaciones.Text.Trim, DdlAlmacenOrigen.SelectedValue.ToEntero, DdlAlmacenDestino.SelectedValue.ToEntero, Estatus, -1, TxtFecha.Text.ToDate, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, CveContrato:=CveContrato, Guia:=Guia, CvePaqueteria:=DdlPaqueteria.SelectedValue.ToEntero, CveDireccionEnvio:=CveDireccionEnvio, EstatusAlmacen:=EstatusAlmacen) If Folio > 0 Then CveTraspasoSolicitud = ObjInventarios.CveTraspasoSolicitud @@ -536,7 +623,12 @@ Partial Class Inventarios_TrasladoSolicitud If TieneError = False Then ObjInventarios.Commit() - Alert($"El Traspaso se guardó correctamente con el folio #: {Folio}.", TipoMensaje.MsgInformacion, $"document.location.href=""/Inventarios/TrasladoSolicitud.aspx?CveTraspasoSolicitud={CveTraspasoSolicitud}""") + Alert($"El Traspaso se guardó correctamente con el folio #: {Folio}.", TipoMensaje.MsgInformacion, $"document.location.href=""/Inventarios/TrasladoSolicitud.aspx?CveTraspasoSolicitud={CveTraspasoSolicitud}""") + + If CveUsuarioAutoriza > 0 Then + MandaCorreoAutorizacion(Folio, CveTraspasoSolicitud, CveUsuarioAutoriza) + End If + Else ObjInventarios.RollBack() Alert("Ocurrió un Error al guardar el traspaso.", TipoMensaje.MsgError) @@ -852,12 +944,12 @@ Partial Class Inventarios_TrasladoSolicitud Response.TransmitFile(Archivo.FullName) Response.End() End If - End Sub - - + End Sub + + #End Region - - + + Protected Sub DdlProductoServicio_selectedindexchange(sender As Object, e As EventArgs) If DdlProductoServicio.SelectedValue.ToEntero > 0 Then Dim drPS As DataRow = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=DdlProductoServicio.SelectedValue.ToEntero).FiltroPrimero("") @@ -874,6 +966,78 @@ Partial Class Inventarios_TrasladoSolicitud End If UpPS.Update() UpDatos.Update() - End Sub + End Sub + + + Protected Sub LnkAceptarTraslado_Click(sender As Object, e As EventArgs) + + Dim ObjInven As New ClsInventarios + If ObjInven.UpdateTrasladoAutorizar(CveTraspasoSolicitud, UsuarioActual.CveEmpresa, 2, UsuarioActual.CveUsuario, Now) Then + Alert("Autorizado correctamente.") + End If + ObjInven.Dispose() + + CargaDatos() + + End Sub + Protected Sub LnkRechazarTraslado_Click(sender As Object, e As EventArgs) + + Dim ObjInven As New ClsInventarios + If ObjInven.UpdateTrasladoAutorizar(CveTraspasoSolicitud, UsuarioActual.CveEmpresa, 3, UsuarioActual.CveUsuario, Now) Then + Alert("Rechazado correctamente.") + End If + ObjInven.Dispose() + + CargaDatos() + + End Sub + + + Private Sub MandaCorreoAutorizacion(Folio As Integer, CveTraspasoSolicitud As Integer, CveUsuarioAutoriza As Integer) + + Dim SB As New StringBuilder + + Dim CorreoDestino As String = GlobalDTUsuarios(CveUsuarioAutoriza)(0)("Correo").ToString.Trim + + + If CorreoDestino.Length > 0 Then + + + + SB.AppendLine($"

Se ha registrado una solicitud de traspaso de {DdlAlmacenOrigen.SelectedItem.Text} a {DdlAlmacenDestino.SelectedItem.Text}, con los siguientes productos.

") + + + + SB.AppendLine("
") + SB.AppendLine("") + SB.AppendLine("") + + For Each GvRow As GridViewRow In GvDatos.Rows + + If GvRow.RowType = DataControlRowType.DataRow Then + SB.AppendLine($"") + End If + + Next + SB.AppendLine("
Cantidad U.M. Producto Observaciones
{GvRow.DataKey("Cantidad")} {GvRow.DataKey("UnidadMedida")} {GvRow.DataKey("CodigoPS")} {GvRow.DataKey("Observaciones")}
") + SB.AppendLine("
") + SB.AppendLine($" Ir a solicitud de traspaso para autorización") + + + + Dim MandaCorre As New ClsSisMail + MandaCorre.SendMail(ClsPaginas.EmpresaNotificaciones, CorreoDestino, $"Solicitud de Autorización de traspaso #{Folio}", SB.ToString, Displayname:="SIG Notificaciones: Solicitud de Traspaso") + + + End If + + + + + + + + End Sub + End Class From c507a42c8164f6cd3e64539ba33bb01f63af147a Mon Sep 17 00:00:00 2001 From: rrene Date: Sat, 25 Jul 2020 15:17:30 -0700 Subject: [PATCH 06/23] se incluyen los almacenes de consumo interno --- Inventarios/AjustesSeccionAlmacen.aspx.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Inventarios/AjustesSeccionAlmacen.aspx.vb b/Inventarios/AjustesSeccionAlmacen.aspx.vb index 726db4464..c1706b6eb 100644 --- a/Inventarios/AjustesSeccionAlmacen.aspx.vb +++ b/Inventarios/AjustesSeccionAlmacen.aspx.vb @@ -13,7 +13,7 @@ Partial Class Inventarios_AjustesSeccionAlmacen End Sub Private Sub CargaCombos() - Dim DtAlmacenes As DataTable = GlobalDTAlmacenUsuarios(UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa) + Dim DtAlmacenes As DataTable = GlobalDTAlmacenUsuarios(UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, CveTipoAlmacen:=-1).FiltraParametros("CveTipoAlmacen in (1,14)") DdlAlmacen.DataSource = DtAlmacenes DdlAlmacen.DataBind() From 5e6bd72c4696589e8afa59a61fb7ee8dcefa2f61 Mon Sep 17 00:00:00 2001 From: rrene Date: Sat, 25 Jul 2020 15:17:56 -0700 Subject: [PATCH 07/23] espacios --- Inventarios/ResguardoMaterial.aspx.vb | 1 - 1 file changed, 1 deletion(-) diff --git a/Inventarios/ResguardoMaterial.aspx.vb b/Inventarios/ResguardoMaterial.aspx.vb index 0df638679..ae6976ed6 100644 --- a/Inventarios/ResguardoMaterial.aspx.vb +++ b/Inventarios/ResguardoMaterial.aspx.vb @@ -121,7 +121,6 @@ Partial Class Inventarios_ResguardoMaterial EsSurtidoUniforme = If(Request.QueryString("EsSurtidoUniforme").ToString = "1", True, False) End If - InicializaValores() If Not Request.QueryString("CvePersonal") Is Nothing Then From 716a35b16af66b351d6854ae4080c66fa4667122 Mon Sep 17 00:00:00 2001 From: rrene Date: Sat, 25 Jul 2020 15:18:25 -0700 Subject: [PATCH 08/23] seccion el codigo barras al ser consumo interno --- Inventarios/EntradasSalidas.aspx | 8 +++++ Inventarios/EntradasSalidas.aspx.vb | 52 +++++++++++++++++++++++------ 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/Inventarios/EntradasSalidas.aspx b/Inventarios/EntradasSalidas.aspx index 7d192b3dd..976d4a772 100644 --- a/Inventarios/EntradasSalidas.aspx +++ b/Inventarios/EntradasSalidas.aspx @@ -546,6 +546,14 @@
diff --git a/Inventarios/EntradasSalidas.aspx.vb b/Inventarios/EntradasSalidas.aspx.vb index b933ebc07..832652772 100644 --- a/Inventarios/EntradasSalidas.aspx.vb +++ b/Inventarios/EntradasSalidas.aspx.vb @@ -1190,7 +1190,7 @@ Partial Class Inventarios_EntradasSalidas End Sub - Protected Sub AddNew(CvePS As Integer, PS As String, CveUM As Integer, UM As String, Cantidad As Double, PU As Double, SerieLote As String, CodigoAF As String, Codigo As String, CveAF As String, Observaciones As String, Lote As String, FechaCaducidad As Date, CveSeccionAlmacen As Integer, SeccionAlmacen As String) + Protected Sub AddNew(CvePS As Integer, PS As String, CveUM As Integer, UM As String, Cantidad As Double, PU As Double, Serie As String, CodigoAF As String, Codigo As String, CveAF As String, Observaciones As String, Lote As String, FechaCaducidad As Date, CveSeccionAlmacen As Integer, SeccionAlmacen As String) If DdlAlmacen.SelectedValue.ToEntero <= 0 Then Alert("Seleccione un almacen", TipoMensaje.MsgAdvertencia) : RegistraScript("playsonidito('142608__autistic-lucario__error.wav')") : DdlProducto2.SelectedText = "" : Exit Sub Dim Valido As Boolean = True @@ -1201,7 +1201,7 @@ Partial Class Inventarios_EntradasSalidas Dim FechaCaducidadVal As Date = If(RowPS("AplicaCaducidad").ToString = "True", FechaCaducidad, MinFecha) - If CveMetodoInventario = 5 And (String.IsNullOrEmpty(SerieLote.Trim()) OrElse SerieLote = "-1") Then + If CveMetodoInventario = 5 And (String.IsNullOrEmpty(Serie.Trim()) OrElse Serie = "-1") Then Valido = False Alert("El producto requiere Serie", TipoMensaje.MsgAdvertencia) End If @@ -1209,9 +1209,9 @@ Partial Class Inventarios_EntradasSalidas 'salida If Valido AndAlso DdlConcepto.SelectedValue.Contiene({"3", "5", "7", "8", "11", "12", "13", "15", "16", "17", "20", "21", "30", "31"}) Then ' salida de almacen - Dim Existencia As Double = GetExistencias(CvePS, CveUM, UsuarioActual.CveEmpresa, DdlAlmacen.SelectedValue.ToEntero, -1, If(SerieLote = "", "-1", SerieLote), If(Lote = "", "-1", Lote), FechaCaducidadVal) + Dim Existencia As Double = GetExistencias(CvePS, CveUM, UsuarioActual.CveEmpresa, DdlAlmacen.SelectedValue.ToEntero, -1, If(Serie = "", "-1", Serie), If(Lote = "", "-1", Lote), FechaCaducidadVal) ' LbAgregar.ToolTip = Existencia.ToString - If Existencia - Cantidad - DtMovimientos.SUM("Cantidad", $"CvePS = {CvePS} AND CveUM = {CveUM} {If(SerieLote <> "", $" AND Serie = '{SerieLote}'", "")}") < 0 Then + If Existencia - Cantidad - DtMovimientos.SUM("Cantidad", $"CvePS = {CvePS} AND CveUM = {CveUM} {If(Serie <> "", $" AND Serie = '{Serie}'", "")}") < 0 Then If Existencia <= 0 Then Alert("No hay existencia del producto", TipoMensaje.MsgAdvertencia) RegistraScript("playsonidito('142608__autistic-lucario__error.wav')") @@ -1230,12 +1230,12 @@ Partial Class Inventarios_EntradasSalidas If Valido Then Dim CveClasificacion As Integer - Dim dr As DataRow = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS).FiltroPrimero("", "PS") - If dr IsNot Nothing Then CveClasificacion = dr("CveClasificacion").ToString.ToEntero + 'Dim dr As DataRow = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS).FiltroPrimero("", "PS") + If RowPS IsNot Nothing Then CveClasificacion = RowPS("CveClasificacion").ToString.ToEntero 'VALIDA QUE LA SERIE NO SEA IGUAL AL CODIGO O CODIGOBARRAS - If SerieLote <> "" And (SerieLote.ToUpper = dr("Codigo").ToString.ToUpper Or SerieLote.ToUpper = dr("CodigoBarras").ToString.ToUpper) Then - Alert($"La serie indicada {SerieLote} coincide con el codigo o codigo de barras del producto. Por favor rectifique y vuelva a intentar.", TipoMensaje.MsgAdvertencia) + If Serie <> "" And (Serie.ToUpper = RowPS("Codigo").ToString.ToUpper Or Serie.ToUpper = RowPS("CodigoBarras").ToString.ToUpper) Then + Alert($"La serie indicada {Serie} coincide con el codigo o codigo de barras del producto. Por favor rectifique y vuelva a intentar.", TipoMensaje.MsgAdvertencia) Exit Sub End If @@ -1258,7 +1258,7 @@ Partial Class Inventarios_EntradasSalidas registro.Item("CodigoAF") = CodigoAF registro.Item("Codigo") = Codigo registro.Item("CveAF") = CveAF - registro.Item("Serie") = If(SerieLote <> "", SerieLote, "") + registro.Item("Serie") = If(Serie <> "", Serie, "") registro.Item("Lote") = If(Lote <> "", Lote, "") registro.Item("FechaCaducidad") = FechaCaducidad registro.Item("Observaciones") = Observaciones @@ -2938,6 +2938,7 @@ Partial Class Inventarios_EntradasSalidas End If TdSeriePS.Visible = False + TdSeccionPSAdd.Visible = False Dim Dr = GlobalDTPS(UsuarioActual.CveEmpresa).FiltroPrimero($"CodigoBarras= '{TxtCodigoPS.Text}'") If Dr Is Nothing Then @@ -2947,7 +2948,7 @@ Partial Class Inventarios_EntradasSalidas Exit Sub End If - If Dr("Inv_CveMetodoInventario").ToString.ToEntero = 5 Then + If Dr("AplicaSerie").ToString = "True" Then TdSeriePSAdd.Visible = True TxtSeriePS.Focus() CvePSSerieLote = Dr("CvePS").ToString.ToEntero @@ -2956,8 +2957,32 @@ Partial Class Inventarios_EntradasSalidas UMSerieLote = Dr("UnidadMedida").ToString Exit Sub End If + Dim CveSeccionAlmacen As Integer = -1 + Dim SeccionAlmacen As String = "" - AddNew(Dr("CvePS").ToString.ToEntero, Dr("PSCodigo").ToString, Dr("CveUM").ToString.ToEntero, Dr("UnidadMedida").ToString, 1, Dr("CostoPromedio").ToString.ToDouble, "", "", "", "", "", "", MinFecha, -1, "") + If Dr("AplicaSeccion").ToString = "True" Then + If DdlAlmacen.SelectedValue.ToEntero <= 1 Then + Alert("No se ha especificado el almacen para especificar la sección", TipoMensaje.MsgError) + Exit Sub + End If + DdlSeccionPSAdd.Items.Clear() + Dim dtt As DataTable = GlobalDTInvPSSeccionesAlmacen(UsuarioActual.CveEmpresa, DdlAlmacen.SelectedValue.ToEntero, Dr("CvePS").ToString.ToEntero) + DdlSeccionPSAdd.DataSource = dtt + DdlSeccionPSAdd.DataBind() + If dtt.Rows.Count > 1 Then + DdlSeccionPSAdd.Items.Insert(0, New ListItem("Seleccione", "-1")) + ' si solo hay un movimiento, debe de agregar, sino debe de esperar a que seleccionen + Exit Sub + DdlSeccionPSAdd.Focus() + TdSeccionPSAdd.Visible = True + Else + CveSeccionAlmacen = DdlSeccionPSAdd.SelectedValue.ToEntero + SeccionAlmacen = DdlSeccionPSAdd.SelectedItem.Text + End If + + End If + + AddNew(Dr("CvePS").ToString.ToEntero, Dr("PSCodigo").ToString, Dr("CveUM").ToString.ToEntero, Dr("UnidadMedida").ToString, 1, Dr("CostoPromedio").ToString.ToDouble, "", "", "", "", "", "", MinFecha, CveSeccionAlmacen, SeccionAlmacen) TxtCodigoPS.Text = "" TxtCodigoPS.Focus() @@ -2968,6 +2993,11 @@ Partial Class Inventarios_EntradasSalidas If TxtSeriePS.Text.Trim = "" Then Exit Sub End If + If TdSeccionPSAdd.Visible Then + If DdlSeccionAlmacen.SelectedValue.ToEntero <= 0 Then + Exit Sub + End If + End If AddNew(CvePSSerieLote, PSSerieLote, CveUMSerieLote, UMSerieLote, 1, 0, TxtSeriePS.Text.Trim, "", "", "", "", "", MinFecha, -1, "") From 528f5d03c0d09e1a790e4d54c48cf9e2137f5558 Mon Sep 17 00:00:00 2001 From: rrene Date: Sat, 25 Jul 2020 15:19:09 -0700 Subject: [PATCH 09/23] - modulo en movimeinto --- Inventarios/RecepcionAlmacen.aspx.vb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Inventarios/RecepcionAlmacen.aspx.vb b/Inventarios/RecepcionAlmacen.aspx.vb index b6642b36d..ea1db1741 100644 --- a/Inventarios/RecepcionAlmacen.aspx.vb +++ b/Inventarios/RecepcionAlmacen.aspx.vb @@ -2382,6 +2382,8 @@ Partial Class Inventarios_RecepcionAlmacen Dim CveClienteActual = -1 Dim CveAlmacenDestino = CveAlmacenApartado + Dim CveSeccionDestino As Integer = -1 + For Each Dr As DataRow In ObjInventario.DtResultados.Rows If CveVendedorActual = -1 Or (Dr("CveVendedor").ToString.ToEntero <> CveVendedorActual Or Dr("CveCliente").ToString.ToEntero <> CveClienteActual) Then @@ -2391,7 +2393,7 @@ Partial Class Inventarios_RecepcionAlmacen MovtosSalida.Add(CveMovtoSalidaActual) FoliosSalida.Add(ObjInventario.Folio) - CveMovtoEntradaActual = ObjInventario.AddMovimiento(CveAlmacenDestino, 9, 1, FechaMovto, -1, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, CveCompraSurtir, -1, -1, -1, Observaciones:=TxtObservaciones.Text.Trim, TipoCambio:=If(DdlMonedaTC.SelectedValue.ToEntero = 1, -1, TipoCambio), CveAlmacenDestino:=CveAlmacenDestino, CveMovimientoRelacionado:=CveMovtoSalidaActual, CveVendedor:=Dr("CveVendedor").ToString.ToEntero, CveCliente:=Dr("CveCliente").ToString.ToEntero, Remision:=TxtRemision.Text) + CveMovtoEntradaActual = ObjInventario.AddMovimiento(CveAlmacenDestino, 9, 1, FechaMovto, -1, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, CveCompraSurtir, -1, -1, -1, Observaciones:=TxtObservaciones.Text.Trim, TipoCambio:=If(DdlMonedaTC.SelectedValue.ToEntero = 1, -1, TipoCambio), CveAlmacenDestino:=CveAlmacenDestino, CveMovimientoRelacionado:=CveMovtoSalidaActual, CveVendedor:=Dr("CveVendedor").ToString.ToEntero, CveCliente:=Dr("CveCliente").ToString.ToEntero, Remision:=TxtRemision.Text, Modulo:="RA/G7") MovtosEntrada.Add(CveMovtoEntradaActual) FoliosEntrada.Add(ObjInventario.Folio) @@ -2408,8 +2410,14 @@ Partial Class Inventarios_RecepcionAlmacen ErrorMovInv = True Exit For End If + If CBool(Dr("AplicaSeccion")) Then + CveSeccionDestino = GlobalDTInvPSSeccionesAlmacen(UsuarioActual.CveEmpresa, CveAlmacenDestino, Dr("CvePS").ToString.ToEntero).FiltroPrimeroValor("CveSeccionAlmacen").ToEntero + Else + CveSeccionDestino = -1 + End If - If Not ObjInventario.AddMovimientoDetalle(CveMovtoEntradaActual, Dr("Cantidad").ToString.ToDouble, Dr("CveUM").ToString.ToEntero, Dr("CvePS").ToString.ToEntero, Dr("PU").ToString.ToDecimal, CveAF:=Dr("CveAF").ToString.ToEntero, CveSeccionAlmacen:=Dr("CveSeccionAlmacen").ToString.ToEntero, Serie:=Dr("Serie").ToString, Lote:=Dr("Lote").ToString, FechaCaducidad:=Dr("FechaCaducidad").ToString.ToDate, CveVentaDetalle:=Dr("CveVentaDetalle").ToString.ToEntero, CveUsuarioModifico:=UsuarioActual.CveUsuario) Then + + If Not ObjInventario.AddMovimientoDetalle(CveMovtoEntradaActual, Dr("Cantidad").ToString.ToDouble, Dr("CveUM").ToString.ToEntero, Dr("CvePS").ToString.ToEntero, Dr("PU").ToString.ToDecimal, CveAF:=Dr("CveAF").ToString.ToEntero, CveSeccionAlmacen:=CveSeccionDestino, Serie:=Dr("Serie").ToString, Lote:=Dr("Lote").ToString, FechaCaducidad:=Dr("FechaCaducidad").ToString.ToDate, CveVentaDetalle:=Dr("CveVentaDetalle").ToString.ToEntero, CveUsuarioModifico:=UsuarioActual.CveUsuario) Then ErrorMovInv = True Exit For End If From f14aa26df189dcba51845ee413426c07b365e364 Mon Sep 17 00:00:00 2001 From: rrene Date: Sat, 25 Jul 2020 15:19:36 -0700 Subject: [PATCH 10/23] -global almacen usuarios --- Sistemas/UsuarioDetalle.aspx.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sistemas/UsuarioDetalle.aspx.vb b/Sistemas/UsuarioDetalle.aspx.vb index 855f31886..44533c341 100644 --- a/Sistemas/UsuarioDetalle.aspx.vb +++ b/Sistemas/UsuarioDetalle.aspx.vb @@ -1326,8 +1326,8 @@ Partial Class Sistemas_UsuarioDetalle 'RECARGA GLOBAL ALMACEN - If ObjUsuarios.GetAlmacen(-1, UsuarioActual.CveEmpresa) Then Application("GlobalDTAlmacenUsuarios") = ObjUsuarios.DtResultados Else Application("GlobalDTAlmacenUsuarios") = Nothing - + 'If ObjUsuarios.GetAlmacen(-1, UsuarioActual.CveEmpresa) Then Application("GlobalDTAlmacenUsuarios") = ObjUsuarios.DtResultados Else Application("GlobalDTAlmacenUsuarios") = Nothing + GlobalDTAlmacenUsuarios(-1, UsuarioActual.CveEmpresa) = Nothing 'RECARGA GLOBAL EMPRESAS USUARIOS If ObjUsuarios.GetUsuariosEmpresas(-1) Then From 98e5d27aeada76553e45808b7d0108ad14befa8b Mon Sep 17 00:00:00 2001 From: rrene Date: Sat, 25 Jul 2020 15:56:45 -0700 Subject: [PATCH 11/23] -- seccion en importacion de AF --- AF/AF.aspx | 10 + AF/AF.aspx.vb | 566 ++++++++++++++++++++++++++------------------------ 2 files changed, 302 insertions(+), 274 deletions(-) diff --git a/AF/AF.aspx b/AF/AF.aspx index c4357400e..82e22650c 100644 --- a/AF/AF.aspx +++ b/AF/AF.aspx @@ -2903,6 +2903,16 @@ +
+
Sección:
+
+ + + + + +
+
@@ -721,6 +723,7 @@
Seleccionar Todos +
@@ -785,234 +788,239 @@ -
-
-
-
-
- - Inventarios -
-
-
+ + + +
+
+
+
+
+ + Inventarios +
+
+
+
+
-
-
-
- <%--
+
+ <%--
--%> -
- -
- - - - - - - +
+ +
+ + + + + + + +
+
+
+ +
+ +
+
+ + + <%--Nuevo R: 27/09/2017--%> + +
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + + + + + + + + + +
+
-
- -
- +
+
+
+
+
+ + Concepto Relacionado +
+
+
+
+
-
- - - <%--Nuevo R: 27/09/2017--%> - -
- -
- - - -
-
-
- -
- - - -
-
-
- -
- - - -
-
-
- -
- - - -
-
-
- -
- - - -
-
-
- -
- -
-
-
- -
- +
+
+ +
+ + + +
+

-
-
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
-
- - - - - - - - - - -
-
-
-
-
-
-
-
-
- - Concepto Relacionado -
-
-
-
-
-
-
-
- -
- - - -
-
-
-
-
-
-
-
- - Comercio Exterior -
-
-
-
-
-
-
-
- -
- -
-
-
- -
- -
-
-
-
-
- - -
-
-
-
- - Secciones de Almacen -
-
-
- -
+
+
+
+ + Comercio Exterior +
+
+
-
- - - - -<%-- +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ + +
+
+
+
+ + Secciones de Almacen +
+
+
+ +
+
+
+
+ + + + + <%-- --%> - - - - - - - + + + + + + + +
+
-
-
- - -
-
+ + +
+
+ + @@ -1085,6 +1093,8 @@ Característica + + @@ -1092,6 +1102,8 @@ Opción + + @@ -1099,6 +1111,8 @@ Fecha Ing. + + @@ -1106,6 +1120,8 @@ Usuario + + @@ -1748,6 +1764,8 @@

El producto seleccionado en el recuadro de arriba sera unificado en el producto actual + +

@@ -1980,6 +1998,7 @@

Tipo de Clasificación: +

@@ -1990,6 +2009,7 @@   +
diff --git a/Ventas/ProductosServicios.aspx.vb b/Ventas/ProductosServicios.aspx.vb index 3346340c1..e88ebc310 100644 --- a/Ventas/ProductosServicios.aspx.vb +++ b/Ventas/ProductosServicios.aspx.vb @@ -1127,6 +1127,13 @@ Partial Class ProductosyServicios Return End If + If ddlMetodos.SelectedValue = "5" Or ChkSerie.Checked Then + If Not (ddlMetodos.SelectedValue = "5" And ChkSerie.Checked) Then + Dim Mensaje As String = If(ddlMetodos.SelectedValue = "5", "Si el método de salida del inventario es 'SerieLote' el producto debe poder aplicar serie", "Si el produco aplica serie el método de inventario debe ser 'SerieLote'") + Alert(Mensaje) + Exit Sub + End If + End If 'If DdlSubFamilia.SelectedValue = "-1" AndAlso UsuarioActual.TienePermisoProceso(138) Then ' Alert("Se debe especificar Familia y Subfamilia de Costos. Por favor rectifique y vuelva a intentar.", TipoMensaje.MsgAdvertencia) ' Exit Sub @@ -2640,11 +2647,16 @@ Partial Class ProductosyServicios Else ChkSerie.Checked = False End If - + UpConta.Update() End Sub Protected Sub ChkSerie_CheckedChanged(sender As Object, e As EventArgs) - + If ChkSerie.Checked Then + ddlMetodos.SelectedValueExist("5") + Else + ddlMetodos.SelectedValueExist("-1") + End If + UpConta.Update() End Sub Protected Sub ChkSeccion_CheckedChanged(sender As Object, e As EventArgs) diff --git a/Ventas/RepRecuperacionPeriodo.aspx.cs b/Ventas/RepRecuperacionPeriodo.aspx.cs index 3718754c3..b5d5eefc9 100644 --- a/Ventas/RepRecuperacionPeriodo.aspx.cs +++ b/Ventas/RepRecuperacionPeriodo.aspx.cs @@ -298,7 +298,7 @@ public partial class Ventas_RepRecuperacionPeriodo : ClsPaginas DdlCuentaBancaria.Items.Clear(); if (DdlBanco.SelectedValue.ToEntero() > 0) { - DdlCuentaBancaria.DataSource = get_GlobalDTBancosCuentas(-1, CveEmpresa:= UsuarioActual.CveEmpresa).FiltraParametros($"CveBanco = {DdlBanco.SelectedValue.ToEntero()}"); + DdlCuentaBancaria.DataSource = get_GlobalDTBancosCuentas(-1, CveEmpresa: UsuarioActual.CveEmpresa).FiltraParametros($"CveBanco = {DdlBanco.SelectedValue.ToEntero()}"); } DdlCuentaBancaria.Items.Insert(0, new ListItem("Todos", "-1")); DdlCuentaBancaria.DataBind(); diff --git a/Ventas/Ventas.aspx.vb b/Ventas/Ventas.aspx.vb index 91b72eaad..b1bba871d 100644 --- a/Ventas/Ventas.aspx.vb +++ b/Ventas/Ventas.aspx.vb @@ -9577,7 +9577,7 @@ Partial Class Ventas End If - If UsuarioActual.Empresa.Funcionalidad(280) = "1" And RblPaqueteria.SelectedValue = "1" Then + If UsuarioActual.Empresa.Funcionalidad(280) = "1" And RblPaqueteria.SelectedValue = "1" And Not factura.TipoDocto.Contiene("Rem", "Ped") Then NotificarPaqueteria() End If End If From c7f6f4d76c9453619c5b0de7d6e3f3ab3b171fc8 Mon Sep 17 00:00:00 2001 From: rrene Date: Tue, 28 Jul 2020 23:13:39 -0700 Subject: [PATCH 15/23] -- liberar con secciones --- RH/Personal.aspx | 13 ++++++--- RH/Personal.aspx.vb | 66 ++++++++++++++++++++++++++++----------------- 2 files changed, 51 insertions(+), 28 deletions(-) diff --git a/RH/Personal.aspx b/RH/Personal.aspx index 9dce78f67..61cb93da8 100644 --- a/RH/Personal.aspx +++ b/RH/Personal.aspx @@ -829,7 +829,7 @@ - @@ -3861,13 +3861,18 @@
@@ -723,7 +723,7 @@ - +
From bb323d26ebf05ccd0900c4a631273daac36920d4 Mon Sep 17 00:00:00 2001 From: Antonio Gonzalez Date: Wed, 29 Jul 2020 12:40:43 -0700 Subject: [PATCH 21/23] =?UTF-8?q?se=20agreg=C3=B3=20el=20rol=20de=20almace?= =?UTF-8?q?nista=20a=20los=20usuarios=20que=20pueden=20realizar=20entregas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inventarios/EntregasPorRealizar.aspx.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Inventarios/EntregasPorRealizar.aspx.cs b/Inventarios/EntregasPorRealizar.aspx.cs index d3a5ba81e..38a82c6c9 100644 --- a/Inventarios/EntregasPorRealizar.aspx.cs +++ b/Inventarios/EntregasPorRealizar.aspx.cs @@ -104,7 +104,7 @@ public partial class Inventarios_EntregasPorRealizar : ClsPaginas private void CargarPersonal() { - DataTable UsuariosConRolLogistico = get_GlobalDTUsuarios(CveEmpresa: UsuarioActual.CveEmpresa).FiltraParametros("CveRol IN (1339,1386,1430)"); + DataTable UsuariosConRolLogistico = get_GlobalDTUsuarios(CveEmpresa: UsuarioActual.CveEmpresa).FiltraParametros("CveRol IN (1339,1386,1430,1155)"); DdlUsuario.DataSource = UsuariosConRolLogistico; DdlUsuario.DataBind(); DdlUsuario.Items.Insert(0, new ListItem("Seleccione", "-1")); From 222f0f2570d31884512a0b37c4a098bcb8b8c7dd Mon Sep 17 00:00:00 2001 From: JORGE LUIS CAUDILLO ESPARZA Date: Wed, 29 Jul 2020 13:03:02 -0700 Subject: [PATCH 22/23] --- Bin/System.IdentityModel.Tokens.Jwt.dll | Bin 0 -> 90320 bytes ...ystem.IdentityModel.Tokens.Jwt.dll.refresh | Bin 0 -> 274 bytes Bin/System.IdentityModel.Tokens.Jwt.xml | 1433 +++++++++++++++++ 3 files changed, 1433 insertions(+) create mode 100644 Bin/System.IdentityModel.Tokens.Jwt.dll create mode 100644 Bin/System.IdentityModel.Tokens.Jwt.dll.refresh create mode 100644 Bin/System.IdentityModel.Tokens.Jwt.xml diff --git a/Bin/System.IdentityModel.Tokens.Jwt.dll b/Bin/System.IdentityModel.Tokens.Jwt.dll new file mode 100644 index 0000000000000000000000000000000000000000..bb9aec48743ab4b3b4155e0636531d4dc9c2bfa6 GIT binary patch literal 90320 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

-0T`(<{9s<6I1hhvAJ;=%1+H8RyQdtxc0NZjZ|*1VWCsH%3VPN^&xq7T^Ddxtme2Y z;;+YjrpDv!)V`C}vK}tTs!TrQRI7-g@m6Hz1L0HeBg-*fRvHA~>-M{jGVGf-vx*yO6d^VD7 zJiNT-S~e7{PEKd|?FWeADrex7Lvd%-mgW`1Yy5zSE9KLt4A!24=KS`9D9W#^GJQzH zLs~_-(cJoivb@v}Q7|={Yhwn7^K%+XKp`z%R*Yluw(?UyLTQm-J_4R{UQ@AOEd z`(Yvs9vD}Y=ajA!ebKzskCC%G$F87){G;I_MKs@r!Gwz5hv5LW#Z z=T_A9*uxOWt!Tu4gq}s?o}t&a4-^#@ME%hMc_;G|luSE-Sy8_MSGEz(bjGg-2NC%O z8HM&XQ$?-%rcgtpDyX088IH<}Mh37@7!AG&bw&kW8|Q)NBDAnz5v~Fc0K=6}zP$25 zbK64o^PHLJOh@;uitz$4GfoQCL>wmq#|TpwMT}L{URnqWPso{v3W?U*1$FEZ#uY z*E``&uAX>r2@Qw%0$aH&*Lj*UpTolX8jU@UZloKtEEA!5fY*Ba31sKU3L(C;_xr8X z&yiUa2-&~DlMkRun_3n2BozhgYVcamQFH@D`mqBt$LR5pUIDdtwthnIoZ^GEa!FsF!g~)xH&tqHWARdFh|B25md>SBB zHWs8QAF;MrkGv#4VWjDg^maUOgz#hNEf1w*>g_c&q4e{fD<=Tu1P-qp*wt9dv7j7F zDu?cciL5Xvl@s(RN4+&d%CVpv_41B|8XgV2GExIt{=bG$NdAS8T(Zw^$0D$3WpZFt!lY5+NHfZm8!4IZ~=GbGDq8 zK`8TUo!@6>n?d^-RIhcuc6tW6lQ<&-#|x=GKKj8+UnLk-MJSz+TP4}dG@KH}4^V@R zeEJuEmeQR2TsrkUrO5Vt;ws2u64_p+M*`-0E5D3TX}RQ8ZNXI#m?twFup#nreVu&r zs$$8sXSIm`hG>E^AMc30K?zGE)!|}(BeEQ>;6>y_{S~8*X=%ooCd)C=JCgOK zu;nJMIYHJ8M6LV-rD`ZY_YS4FHi!51rZ`{BQ}3slVw2H$fx)Iry8AVBR|VbC#@5wV zmL{`x_hnQH*e{Xr=gKFuT|L{EFckxd2j zo|z6l)I|Tj_w_K3x}>qa0UauaJ4Z51x;`w!#5Xg6_g7*$tUOOQt`>V%DFk0Y4Odm()9EtmEoG8d5pPkT2`?n;kR{+2+@5lB)#nsBMy7rlU409GSO5C!# z>nofefmh{V7ooM(?}&vN0K0Mc5yw%1#nE<{VJ>SY?`Vt^3n2y1i1zQsgLZ#8y!#`K zHIzEtXStzO&Q0;(gQl)0iZ76)8OX6egUp60&ekU4xDu|% z3uasa8#VM8A-5 z)Z9bmVXNw&jh0n*TG`yNIDq?{doaGIL8^Ez5@rc~Wq|4i1%^!DcTsh7%{?hJkr!Ns zJqHt=hv)V9l!l+dMi*5j59Xe;LB~6Tz5Pg;RsZCIx_#yz!g-&NUtHu5@g;2zZxsst zyd$VzgoB$L4)Ak0F3++5juGY9|HJVA0dknW*QSQcxZSewfmP`~CYU+0tX!AP(q*c5 zTG|&lm?v`dW-&8a8YXdkhs2S7|G|$z{r0y~9=&>WJcN1(gNH(sjBcBW9jN4Wpu07S zvq4iVK^xQ3GOT*Dx!l}C>S0AS=bEKbX5qS`Qa(!$TT;w?qK>o!+Px%CerfMM@K@`q zd;s}M<-3q1J(A90ze?vsz&iI^<;_y#Ka?7mHX0RXk=C~m|!q^n=*Nwz@x<^HsO zX#^hqGRpd$2YFyyk2ylMrG7~lu70`Ia9yyJ_w=M++SBhPS+P!WQsdR>9^@;X?nQE> zPKh8(r#~B8r#}UMQm0hUqf=u1Vtk;}+wp)-xaU3lKqf;t(qS6gdoJ>!Ln2Z-^w7Vo zb;$IDNgWPRCFqbyNr!}|b;vE2>lRsuvPq`WI;62dhmE=AcY;J<|;YZiCgTZkBcCfxSM>u<`KztG?`er4e13rsLQi`4 zS-g(V8ThQl2XzI;%)hzNif1Q2CHPd~Lv4ic@vAhVzkE3=oIB?v$}CYICU|YAxon)c zt_*`0D{}UZvqUY!Z6QkkGiQ6gCGH3<2j%Ob?YWjH3R8X$)BKv@r3`<_@IJ0pUP-k! z8fTc6I2ACA9rPLIiDDPVhF*{p5#L6RC8mUk@}o@u^*lp1;EZs&>oi^f~{P7}5H6TnijIC49Ff8lmczi8cFSSnVADd+12 zRQCynzhn4kz(NrjM}2LoCiwRvg140s%muW>kE$;kUno*sx`#`zucXqs$g#w)!0iMv zr)V|Wd1wOV{56m0J3wiPdyAG-6^cTxJ2zG{VS<=aygEN3I*q1sOMD|h{CvFRKS6nO zfM8)xb6Kf)Wzri3mgoj=lSFRuN=W`8rYtEY`cLynSF^)WT)lLO4R{?{mvOrvF<7(X5SjLCb%fM5SLXBKS%4 zRVelsP|NofZqJ`AzFD?-LPVIcPeBfEa_@y`tx$XqlC(riE{*y|&VOYbwQyJUFY_#M zHFLPXgrv6^tpS3jP`pq~u#9smD=7VG)`$U0OFYgNVxTU}8SaQ6&C(&5^nc`vs%4A~ zV?oR*C(MtTYM^XpiKuFaW0BYy3d<40D7$z9Q3mnN5UMw`g0LJ+KLhV{`HMsqY#mq* z%KlU)s)jMMW^vhgAC*-Dqq3*CtXiz&vfOc^>f7QN#)S9_TDf1Wz^-fvl(&I$8GZ}q zTf&FlUxsgN7rl&uYve2g_HC3E@cdo|5AXnEbzHUwb{!R$=T3=5#jUyZfcuK)#7-Tm zi#}$YI#d%QxHSJUBPte@9D~xXlH*bOrbYQqCBeUPI>G7RRZ-550oM)PIB7|2-OyJV z-V1o@P*d(>5Z;CU;u7|r`D%kM1xIOzMatr6lAp|he_ z1KXppZ!@-EVRMUbLK*$}#0BO1OK(YI4;VKE?ugMYh{_%?t_yr4Mr)I(6g#6s1%2eJQrjs!HR>} zS$%@BPlzvuUyn@@pJnU;!www8Zut&Xb_dF)if=M@p7>7wjOuCP6-60~9z;z3SH`5Q zr;ADo##n-l)zih&G`65RF1pg#rs@W96>SM1rN2!&D4NBM3i~0rZWdor*v^uD)y?8A zg)Ou$1ooi9q5&#6!rngrCA)Ou#=#pX0cLX&*yg;&0?d%mPHBcWbA>Q>&K7tHw%9w^*1c$My^1c ze^poouz6y5Ci5b`kw3vYMtn(Ow~TMBK2~(kqOy;Pk61TWA15wqlGrWQgZQ3f|7^mf zR*n~6QrJ)Ozf`?QJl!nILKD7LjTb}b5H>90*4@>M#pbz$Jz$XjmI!<+i!svs5;4FS z*~G!v60u)lcK}<8-*F>K(sTh<>XVPs*!QcKi#*zgaoHo)CyH0n*srQj5pf(2$+F*6 zuNTisEOb%nL20%aR59GWI-JULvQ`k$8{OMwoqWo!L z9_npo?7Yy^g;8KhNg28TlxK+Z6?T0wVb`mAkCZuH)(o%FAy%ofWbh#NN$XYF?qC71vlx3IG`Tv@NQljf@~ZrUA|ZMd zM&2eNb}NiLSVCN=>YWp#dY3Eg!q_JR3GpdKIj!=b*ebrR%4n`^6^|&4=E_#_io`?< z=H^yWe+NqNso@l!W zE@Uip=lBM(U5r!M564#kTdc6NqOS*bh?NQ(h%T7CLu^slw^7zDwkz!CDC-u(3ac)B zJ$t0K<^J|k{TW3@Hci#rw8 z9r>02MsddqqC8)`ZXQ+hIq~obvfgEpjn)^$9V-bN78`>tHD45qP9*F;V`K2-n%hL| zBw2QP#c4HP5lsr)U$LX+Yho#5_ZjzB57vBL+@Z>TkULoOAEJv65YXn!z`iAZdkSIq z8J*z|)!Z$<-D_~mFJBOrKh6oc*bP!FN!l&8TI~>xJqHvJFpM9y}u;xVC?xE zF)7b@Nqkdc-1|%7yQ++Oe@Q&3%Kloie9B8Ax6SSSB~iqf?ENJ%OO;XYFN-dPQSUE{ zO`F}`Ul#q0$=+WU=Sqxwe_5QT%Bc63#igo@dVg8`L}4`cmj&(Gt19W_DjcBn?FgME zG{wD0V{464LwuWIHl>MQ$G>_Vp z?T?oKE1Zw$-ep=!SaRisoz+C?f+E6KJwCIAvaSj#0ilh zD6Qd%OE0 zDMwS%4Aoq@l1Q*$sF%kWLlOI%MJOas;i3Q9uiC z%I_}?iy43gqKV;rz!K2{SRq;&uI2pG7`8J^GCZ5%Aj4sX&jVWGhsOTW>0-S31lF5s zlh&DHv2W4>q))>tT5ayb3Q{Th@dEw~vmYx)lS#FvFikz@&*66Fh*N#%i#f=-R2+-a z&xoaBZTJqcN?6r*Bi#^NfHct@E2x+CTx-7h&x!}dd^5lD$D#!-7l>B#gMr7zQ{w5s zbK*4fk-XpH&S!t=tAOqK=i~1DZ0rG6iTz=p@h7yIXAB$nVK0+3e_35nqkg2TJmO^H$&PB%-fh|t+6(IJgyaKKT-`E zfS3hJvZ{8IAyZMTFZ{Q8{bu$|B`(7~(BggkJT7K4enC0_0_wqRR z5;e{UALqMId~(ua-<@Jp{&LV?ZLIQLY}Q$8eTHv;=_cPGWQAW^FvkZ9jilLDneat@ zYb$zu<9$w^gY;*@J-(#bG;Wu#Qw&uu0OhL{S0d-tick4k&C|wx&PVd!g!F#~Kj(W& zyoytSi@8m*x?6o@MgQr0nt4c?*XAwuRr{_lU+lZup#AmL#yrqpZA`0t1Ud2G24w-uqs8~v*hT(}4ccFk zB(L?ig5DB?2JKk~4cf;J@~EFOt}Sg4PZ=*vcmnjaml-r@Km3&ODeT*BG&-wZ@js9D zU-gr0OF$_(Z_CRGoW`8LVsup(1#ULZEUE}RW$Y_CEzs_}DbN;3a_LjX!lGp0Y|eSg z=$b%%Jy&c829Yxmc!4eC1-6hsv8D#ikCk7^b;%xRFa9T^+xkpkm|OdkL0WqXJEBJd ze-J|x?uLG8Z+4^c(bAU!B|)>2 zzy|=&uzCS+DZU6W6#JOX{mWwTbQ^WvZT$~G7&*@p>E~MuOe@;Xk zEfP5)_|9NBBo>K0z@@N553!1baWaFeJ4JX1^q+$3kE-@dlTPyEi$CY}SlL%a-lr}!)2H$`r41fD4dc#oJ4c%Ntld{E2&Fe8V{KmzX1G{u@ZN#*BYOyfJ}^YD&p%K&U*IG5pkhQ~2%0c^x?EBaQiY^gPPJ6ES z5;1SOD7i#jHvNXO9}!m!W95`y#BejiA%-_Fyocd)3>S?j%FPUi7~a6}9)`~`6cd<+ z;Sj?c7~aG1IffJ^%C|-6nTz}8*J0;J8^;-IjdP81bB(#)yvY2n`7<-(Yw&IM?el%c z_lmFDf4Tp&{xAFg=0E749Qb^o+G@2vYdvcH&hiB(1y=;ygNa~Ya3HuhxIbv32Mcj^ z2r!KIRq{j(_v;G~hb~1_xg2pO9c*0{T{}gHzcbukd^*xIOSS->QL+v2xZG~QTdN7~ zHwkVS-v?O3>8(D>iH;ut{A?kmAFd$y`Xqus=A7LnyOCaOod;MFp!BVrzb}tyK2}Ki zw{rS-6_l>y7VZgCdP{(4)^T4i=3k0*Ym{KYgpUG#sgz1DF1s$B^LuXjcTC?<^abSq zh|@nSCdy^LTLHftxdZTj!j$uwDuPEb&88Tof5mOaiYPsgN4GCX=}pz&0Q^)wrR8{~ z9KIQ&{Mt&&_j35+_`8sERrI@ne`nZINa^jx_=g(AF_Rw!v=}BMMEPNcf3+S*`nk%d z056*OEMUV#YCk(|V&~!GPXG`*C%_2amoT8^9Ha|iPqcH$MY;ky$0-CLy}LRN=}CYl zZUCc5#{f;-;}s!28PJ5MDFK{<+e!nsZ)HeN!|ubt{n~h><7m&oKBNNaTC`_kjj95i zi#AMg6l$Ad9_pD`wWb5k2dxR4s{=enGyoneW&$3ET?|eJ;LA)LAI}9`gnB0SGxGr# zgO=X(JPvRv%JE$al$hc)X=>){v_+kU{w*t~{G;Kt>3(&;xf}Mu+c0laD(Sw1N^9-bW(1U>)dKS_) zdN8n-wjq5sdcfNVfF`_b2h#n3Cf*iF0PaNFrr3p6O{}*&00+^MA$9}O+sroLxoE=_ zdr_OdJ2HUM4*{Cu0@TA>AAly-DN$|%;u>3~-ma{)gA$|zPvMAPCLV;;h$>_zEavu!$wmXaeK%oaXzU@1nqy0n>_D{vkTkz@Y{H$fMpAgkfTCxPKQ0m*XTV zJFgPw5ZQV1%_iL%m0uC8!6_nM!z7^ot`5FYK*`KLR`Xj?nRQp<6wc+2(pLl*b9>`3 zFL5paS>;0tRMn4pGm-dgUAn1h_PklMRH8{IX6r<=PRvn>IkTE{EuCo6iP<_ar%4>U zBGKQ{-Mucktru@fo|qU+E$nP-JE}>n8R+hA-_o7f4B}8g zcXtnJ=9*@!0nDB)*4wSU{mrw*u_q1mZ?Ok@JC}5~CwtZp_9fOk?Y*h3w$npw&jp1X z&(cJPGuTHwriV0JAbDzg_dw$0_N23!T2JyQ+MPjQo951%za-)GC$}a$+WQl_^QLCa zg-$f}`q_ve(CnD&l>aC~p+fb?PjrE7=KcthaY0 zdUfW~L<;<&WOriau6~_MwJ~CiDgkH|GSJDkKGk-7?TAT2thvPI5MOCHoWW`r11ZqOBM9mg1zM zN+x=duT2TnWJbGA5ZM}=Xy7$qePVHYDsj}D4NkYTMzPA?w(Oja1iO>fiBt+UFP8Oo zw)XCXS&GGpZOLAh_IOH6;bf}MPLbDypIB-SP~wyU$hIdzp6i76-cIDKNc0o7+_8I9 z4zry~C3?1W53VKWx;2^Tq*)|3^d`?9NN{pRa%ZBKQ_I_XlHG$cGtrOPpIDC`#IioS zql;5g4E+*WZ=;c&2`7aaN@Q9rtCCw2#F=R6>r3=@u1fYMSjxm3C)jf`29DYNa?XYn zrp6d$Ox?CUW%s7twP;Iq*^aEw#U0v_iHb_ynzrtmpZ)C)M#agr19K#wYwZ5T z2`mT+fq$z~rC_ZPi_~UkdWNRQ?&grFV4iMn>+y7 z&8Z1zi=9enH|w#9Mrj_f4QKG=b_X<&D^@vDVD@6f&3hIn)EVfdRZ1*QI{jVbA;oHR z3cr%-Uz+GnY@?iG7dExErTQr;1psfkF3~aIV6~PG)k*H8(v68NDa;?yqKs~JqQ4z& zwzu@->l0fBs6H0=WOu^hr2$ns-J+$5Ed$%Ok(Il7AU`#kN@nEg#@8qNy`-)E2rS@` z))Akp+dH~ocy2@MSpMt;uZz;BM4LunKiJN%jeD4^mECSV9Xk|xqZi-Svp zpiLq$QkbVq@1z(?`O1~M;L{S@66a7N?KeFuGglPs00)n+Z_s$1-r2I_9`3epmtxY+xz;ctQ(o@?R6PWPM1j$bCs0teq*w~>u}}v z03t2f{Ptb_+Kus7o5YsPwW@O^ysiA!lOV^dlHf>^Ly0Q2oTorP@htg528Ns5I!IZq zsnzZM9bK%SB^0`gmVSPq0dho~28pCtmFV53k}La@!rrnSzGSesV+rEM&(dy=z^_8nqbPkS=mik7KV zDZ98-Bb;7iXLq+C!BDWEyWG^%&78mi^|0M=LaruU0K2i_D!Y0hjCBKjeOR{O_tKeU za_MEk&2CQ+NiJ+zdE+S=d1a#QkA%B|9k$5Myt0#A4g-PPF$5TDuYN z^a}K{G_kcE&Y#<(`f?$q63$9_@|Lvso`M*XMI$heIk;9R4G87T27Ixkk)|QjieMvz zqDol??K=}Bhh(oy<;Jj5vgwdkB;BOiqRCn?YKkl+LM%dU5`o3bgk%Nz+E`?E%DbY8 z?ftY<5G(CuFAH@YA|fdsl33~_$s{)guTGQNvlwX8Sb=W=()NPAx6V8zu~qGQ1xyjb z#V!XeWH6(Kg#6_&%S2~7YRn{4gB^to!AmP#eWC{;xVJj;($d%I!Mzj$pGl)}mCb8v&HaGOrQH?k~DSKOXj(j2pXGzhMxM= zVo6uKBPlxMQ-<|iStY5yTHRERN7<@RV|D~Bti0@^ zFx$_`y`e)M>x4u%=9};uIZ%w3J+mWrk%N}Q_8KWdV#=n#YLx6ztXfsbFlv=YvkdVu zCTqH(!%GqHLFlXKAfhS?wMDShy9Ebjf6nTuJC0@{~l%?nVb}Gps(>yJi=s z=f51D2W?9`3)zszpd@WZMq8)rTqJ!R`%otD$$%?SFHN>@>$OwZ8K-oX zj_nbGB^8i;c4KRxa~!TH-55>=kbz>APxFo%~4`n!@TKJ8EwAFGc(eq>pVl1-*J zTDH8w$ZkNp?2IEzw!G0xFvyWdoPswSX%o>lsOB#-DyOm=baN(FV6Ur9ala!nmFpdm z-`0~|9m3?x6V=(V3!B^8I>;PSV{U9&A!8SlBggTNq9R3}k~n(+wnP%f$v(}h6pnv- z``eR95c#rm`jLlVFD;MtIOc7H9S?N3JFr9;Vn(sYE8-v&4JvnmCer3D4UhfDsHHsA zopQsHSx=GMj%)(U2u(Y1jFYe4{*-hK=m$w@vnzL{^pQo1_GX#4U#z$6wMf%ttU#W* zl9i7}Nn!}1wT;PZC~kYx+=eR(B=VCAN_+HJ-}A zu{v-->mgBdhK}aQ;ff9{iR@os{uEbo>+BHH_A%D^jtbS$5|$)7IgrN;lvr)=Oss)> z(pEvPid)7(N`I;!3nI@{WYV%SB9n)nzRKc?2w2?9EgiymauB$9uuXFZ#L685TysNz z#~S?lK4ir^(+(VD$ZJgAI`b*25&({FM=e#pPM*G;lIZJh9~3KF9ETq8%rZqhW0BdD@mtoC|7hi!hx4|AnPPoYS=4%Nm{?yqKwXg%9Q~CUp#kGVZCcS}M z&N1zvU{kfTb7^c#`lWp6iSr>27;y3~TD8$CBb7^cI#XX@F6-$7F*U?nD}Ac0LPgp1 z=p|Gq^SC*q(ilZ}rzF1}?h5zOwC1Db89OM2C?IrOUM1BWqw*$jbD=@cbQM3iQ z#6cJ8wBwl&V(7eg&dgk9hT!3t(cRj33Cv|i$$aqr zDF-i5+F>RaO~($Hz6}|Y2kD1%>_DpL2t1Ds$#2J4$qjqG zlvhg~aJM3HXbHR%9_Uq78+}0jLCJ;K@!s`DHb!6XYqWy|iNJ>O&9kP|SEE zi=%llKk5jklx9Oaybh?A%-V*yGgzx2GoZMG;u-qS#;QtFc@Td3i*KK83Wb^w5Y1Fj zcawy*QS&myp*cr$Ac4TDAGGpGOp_<3G76H2EyGUVEUl0l^1 zKrHQ5hQ9jmF}%0H@(exDEf5Qds006zm~g&>A=C6Fal#OXKL779xWlqJP7f%7F9QsK z?Mwb0*jCJxXy%fTC>$GwhY_2zJtbT$XGBlUu|}Ux9ZVW3YvJ>xipQ=@}Z*6FTdZ$GCKQS2_J&ps?i6SUeSj>_I?k?>tiwv zD9zMN%`~mmJ-mC6`wa?@<+4b7UA-X^L-)SlgBVRGn(54y=Lm<8cCXp=X`u{#{r}D& z(@du$TynK?t?1*`gSI(hX!y`W8tb6KyILIiYC9?m>G^REzOhZG{&e$2Rwihu3= z7=x)AI^m!bP?F;4`|EdU14)MfGkM*V$CZ^YB>NCW6xCL6|J(};Sh zl9=l6lEmLV#)&BdX5tQpwmoDda_b{4`Ll<%ztArXgza>o+XL8( z|J1F^X@}-~tT~ve^(CH`*XWjK%0nAmB%(LE>ycBRT(<*k8=wuRfERCJ%yh4C{h?Vo zln}ix;mD8K-Xeoj4^6L!@ea1a@5L|_TV>hIYj)q~TT1d;u1P2+CK7WyVFt8_cH)_W zS)@($-3b}x?DBSWXiuiupc~&omzk)y1!=d3xeq&(-MS}AZ4o+{cJsYC_^|03zR4A5jDUn;T~ z+=V>31^<_*S1&d;4lfiV84S|4o36FV{@#@{&9^#LGz0pSU2hzirSasDI$?WsQA&$B zUF1@%D2CpZt=>CX)U#Qm<(zK0>5_-89TEt$G`mKP+!^fxje`M^AN58pGPrtIu7uvn zkVZ0@9Vv3amFq?a;-o|StRst1R-~g15p~=334hn!Og1O7KYDx9JyJ~fp1~8v4Sa_EFX1WO`*d=2w4Wx2 zxeceFy6)|J=Mu_E0g#AL_xCC2?dd#9)qo1T1+SqrI+sHy_(3O z`)djmM34?IamX87iQl1Ij~_v$0D@kUqkSG(DB123;IwE{8RbzcqzZbK5Nxclo zkt%{aq+R0$KWamq-HKn*+{7;^&EeOT7U1_5m$CPt*-UR6Q_gh!zT__gsZv@g$!pU*oGmYc!jsltht!AFK_z$_JsZ z-NZwF2VOEIUz!3G!R<^Ta-|;VI7L*g!Y_v|!LN<3f&^Od3!&@93CKAGzcacXzY8jg zR-*5dF#a}tHh^lC5WYS5EWl?ke$ZE!ixQn`Lp!J7zZR;W>z)M?H|`tqVr`}adOLF1 z0(nU{!54P#f@I06<-I>-^Db~mI->BHRx$)l8{YYtGh1wirM&yC9)(}I6+?e>r_ek$ zM>&NY41~-y##4d3Q76*7U|{rqX##1v=um(~(>R85xkrel4YU!t>)D_)r=V*fF=e(f zOm6K+B(0oqx<{H8G4zxIq+Q7Xcp!er#QX82_YYi-$ej=uHXxY{)$}R|(>VWF(Ms7a)5)#Dp^OGmR{P)yiPMwAK3Q4~NlznX06xhnkb}>ViwXkK;m}SV|eKmSL+TDg3eW6!X zP1v%L?JVVv$o^?4ST&nx)_>qT`*C2?TP-$1`5ey_`&q!0JU!=amh^|-TZ5z(~MaMyN#(@xO8OFT&YJT*Y~(bEmi7KNfp0B>3y^KosLnyJDe@k zQ(T$8r~PS(Qh!RK?`eNpp46X`=g>FwGBJy{(lTasmvnb`LF+6n_!NOEz>(WZbZ=5kuLD zCAtI8>@chmeNvF+2C8yFAK7~5I!ym&Q+9+j0|BJVImKu6HBQ=<&16H`)u*KAp^US%$&Mh;Z~H zK#D2#e&TR_xIy?^XcgRXJEm=+&tt=g_$)MCV3y5gwkGfMS8o4byGSQ4im2G*M z0)1};Ck0F*AnTR;VcK(@13@L&ZAk%OA5+o7q1Dl_Em)Vdgk8`ly)vwiX2=p{yq#%xWRqSIy1OW{GQzTb59Mj^;vW6c zR+RSAWF=(HqgxBT?nmBIzB@1brlTWmx6RsX<+|&I*uPf`gN&G7-X`)T7+x=qrsYEC zt^jdfvdEa_SAj@(a)|QMA;D8np66)c=yNOjg$Ft<)B>R`OJ|xny>ktx&pTZvX*Wz~ zWVE@^Q%as!N^hzcPkH8}7wRPt8h!6UdQxd~w5AcKnWrZ){G)eNR|W;-MBI}kDLgrI z^s!&&zMabGDpr@Cj2_&xqs9?OhS>}Fbe5TW8Z}yva+Z<-(5gU^7|Danf#g;@6Qb6B zI&&PY;QUBVl(NS#+R0Kj&EZd&XxzpOd1_4uuI_0TNsuNOSqP1m!gSH0?UW+bIVy(9 zcGQ_pHM4D!1L@YaD?Kr^?HNP2>Q3Zjkj~YewdBcVAnVR}@&zPBa%b7>xD$sAmwpn2 zx|atDx^w9Pq(5+3qkA?@DJPPq*WSSx`iYm>W_3V!xEPN9IZ$bVhl(7s=k923jczg$ zupl~prlaw(2j9r?y!7*~NOT`5)-o+^H)jrLbiYiY>geGPt@>mzBx)9p8Lt5_Q-}Znm^DU;Lw_O&)KC0})(Ce`i$Z2pNHbDyVpF{6$#Hns?Bn>LR^Rr*ndPhjr?kY0;W}4z^pz-S zAA06dx3s?^myzkCbl{gA)UM~b7DFu(B<-o`tedWC^a?zkkLGEYz71@XJ0ce{T1X%# zhdU2X<-s4`1Ji|Aw$gO$F3$j@H^?5*p|1%bw&7%^u%y@hzb-7=%1~&e{fJk1as%kD zD`ac>vd>FLw(ipESkZO7M=I*{nlU`pE9xe-W%>6IHQBQF5a->tOA;*I=1FgO$T(ow z6Ku$DG?Fj*zb>Zt!y*qa^Eo3ei@JmA<%Vbbq+P!@%7_Fwf+NXn1x!0E$`f@MnJ%f}%KO&DFmnRB?<+<59 znD$twWSPTq4|GWgu3$$K2t-g4<5g2`A6hYas5LS4yvqdbspWa%Xv1?mAWe<6y2<9{ z-j0H4a(kIJohnLnZXWTISgSwMM}@er^|QXFqC%k>lN7hduV9+e~kf zhra3^BE4ZoByWF+qnWk$40;C!O>gQ_FWCci&!t9VS&PAQt-LkK zYgR`ahU*sY&6K=6+kgAR(C2~KGek?ALKh0D$gO0ax6#^5F2y@fWN1bCwD}o*)`;kK z-VnJV7Jfy}9TZJl>Fc~_>3TQhMpW`NL;iLHZ3Sr#Y+%17BPt4(={QKf%BUkkvUvKb z5PizxJ$%$FpZoS0%@Q{ZA)j}bW|VfoIzTuH9Z8?0T_>?1U%i-)$Xg#(Q^+Yj+Gx8b zdCWpglVmB7mFHT7xh##fPj+X4bSkt{(9>2LmXYfonv0>!G6&Mk#BSKHW#LxQYNm!| zq&slB)Lt3Rg7QZ_`Kvc<@9rTgtQF1MNF5k_iG>%toi(Y{gZ%G=`-Ok%pO zpdXu{V~u+?i}G?o`d<0YmwT8XH;~y|RGJ3F7R_cY(+>8l+Gonwv$EUC^tt%Af>2*B zJ$iP#Gk@g1U(@KN#qdUzbaf=9d}Koy?F_{=6Df23W})ksDe|NPz>zP;kKBDj#=}0Z zjAyA+mC+eYamXXT>n5GPT($J5UCFrDgQJC9qaCQamv&?*@_^aBX`)*!?bT_*>vJ2~ z|68pqS698X(K7P`uMl(uIl2(C4K4F@TgQ}g+0lkKa{1BgA&G8mGjau*9a3kSq-$=s zdk3O}t|J?WZ1T`y@4Fpf8Rw7Ul@@}OPH0B!k&--H{Zhl<|GkBx+gk3BOt(0Lm0y- zDI9J>cY&Z8DclSGBcYgyW(tZR0Z}+~FIqCuG{|$%*~CBqEl&*if=0wbTf^1dRm2}e zSK**h5*_-G5gocXq!WQ4p*g}d@xcG!DH53o0SZQpFg;>E$TxC)Fc0#&nnVYIKrEFk z77StNI+kfAj}s6Quapl-At8yCYfEWW;sFs=nihr>pbl6>7%Suj4WXPHlG3ZpX|F`!g05NrMHj0_t$o_YsQz*Fzzsoi)4z=NmuNU*>-NbCl2 z`nb6RItfM;wVs23p_i@arDHiC;6{Rlm!8@!!9pKT5-bp7AQ`466oQ9%Sz##&7H;r9 zkx5j5G=Me^HXOhd0{$zqu`%kLAd8;O9Lx1!_yKe=+O7vT&=#)} z8wczrW3lw}kJSNd4G&rQI=cgy$( zh!C*$Ic#iGW6QuaHt2Fkk`UmrTNSMW_$TmKS@E*;8@d0R$@r@wNK`D&$8XTdqwt}J{k^Co`*L- z+CZK+(!kE*UdGOJ=@euJru%l{rxKaULRQ9}&~T zsA-4a6Ho(-Hw&ml3oZjlX4)VyBvq?d zpER)g@ZP|tZTuxECSx5K!BAYm1bq&lodK`d!gvJaK;Uk zj0JBf6vaKYr2<(nLV-8C)>zZ;=2073}89((kDyEkx_jI3SUbxAga$)9V zctArtL;yK-v*u=;VCYR>Rtv*D74#;8LcOW4>j?hpyGg7J_iS*3%W}|ZC~@S5&R5Vp z2a+l$+;u_hkWs7*-)>g8sSif6!o|Bcyg^rCVJP|g`IA1pGru~tVdjv4w#-n{3T5Sg z_S<8B?l>2Q+<~EQVLJSTGWRENcfu6zt8@YdUiVX z{qIsYQ7dP{{?AuIPzz>4{Lj-sP`Ay5@bA^yQIlsv^LHujsF!EL!LTO$S@ScszMQGc z{AcLwe#9nYR%D2t|0fR=NZ_81&Hvw>2WP&Ozt1;tCXH)M=hpN0=`-77 za8!m6m^te(Y!9Xkbm0sJhX)x96gcbsd(Q@=Zl4a(-+we1HESk3jNR0)F*N0|G-cEM z``DV=&ok|Je(#vGDPK%As9^wp=|GtTi~xAy9cqkN!5ygFv8;H0@F$32We2wi@D~IA zl)xVW{2@TuNv(%Pff@?Kih0@QfC;_N`PM;6EXL$d^4Jeie1SNn4kaCkCM|1;9X@nirzo*(Gb(0G0r6r=|Q zS^3duNfb~{qJcIPUX?)ApiB(?8o>pc!N*Lf#$Y&t5ypY0co`~KMh_(DI(BA%nA$An zU7oIL`>kANDY_C4D5-(M9+*Brr8PeRXvmmG0YLK(72Vq?L=P&#AVLo! z0MS4rOGlRkgaZHq>46QZ62Ti{r>B4bcz?V&fOiNXP@~x8Bjz|8DF^Nx>^ zBe4Hb5qtz2&}IUS>rHtAJM81{R)~*~C9wTrDF8BE>39p^ zLA@Z%KvO#}VNzQPYZif|@Pl;#y-5xN)Rn>_eDH~Bs#1ET01lW3!t}r$02zRa`M{JO z8x{f>g^KKYP?)Z^glRyD43y+hy$#?3`gsmcINZRUF|aUrG7BIH>dq+xkZHksc6R2t zg#kbeICd}!;YARu1js@O*doA747(D@r_(+N&}pAV30fs^($ncLfKdceCU}4VFG}!& zfPw&KP#uO|f=+|*DM)(kj5dPkWp;ux;_PS?U?$)v36-S|7~z!^&rq9?VAE(Xa%i}J zNU(z+B_t{g4az~~Dhg$UM$IRwX{sS=BqD;4hXEd3^t?QE zy?r#iJiRn^wMb-5lD96IO!Cpx)kdNC(I~EI&jbDi670#8NPjP~=bAt=&Vdp^Mxj_B zIPeO7mT1%*H5*e0Gm2*rIVyw_pyEiTgaOzLBDK^=0BT;r$t)B9u+Tuy7#mO$51%1S z<`6(xF*Hip+TV*35*FeUPB0FkgoaQ&VK0I47dINkwwxSD_6!5fYobwVm&ypgE=yPx z7)YS_`}&245h&y^06Wfj3XJe3hY`YKLgCfVGn^1g35oRgCKJLULP2xk z1fLKJ!HYr$?FRd*5WwU9o`L?cAVTmA_9jGvh&Mftu*BZhhOm;nhTsqqKn@NAO^BmW zv!`IP^d<*~`-jI^hj^2LW2qb(C1oEI7ETUQn~|e7@%WM`aFQ|(VssT6<@^UF)j(-` zvR4EJ)K7oj0st3Crp#Ml8xg)HBqG?`IMCBS$N_ZIf#Mk)209gF=dndF0KNA9zQF(^R^*s4SgSS>g>pip?El4DO~_u97&=u?Rt&&Jq0D1Tmgh8N^qd%8 zXXx%>kY^`6kmY1}Q)^zsv+q@zkDBh}+-+&;h&mOkbK?|s!Fcf@^vI~j%Zl>}pI;%q z8g8N->N$Dim;yyt$EzRDE8QDAnYKTmop*a}jXQZ%g8h}6y1%}F?G5siT>%F;y_SXw zWbd4->?ZX1p~zbke(utky%2^gcbaaY(AIWvlx+roPXJ**nN6pEm<>k*FeyX9V_l2H8cGVQnA-o)Ob>FhHtIb-YGver`7)jPJpCyeL2dHMpn(QxyCL&=S# z?H1-1M)7j{1KhfWtXbCb0KYBtf)O!ue-eQpkNgFi*i3Af8*jvdGPuiJP ze0^cBv?@-49x;DyFic>^X5KGND~CdPfDvpG7-;S3AB+kL^9rGm$!gw#U?|Xk-{nCq zKcZ!3b^nP?U;s@=ln4q%orw}U7Y6F?pVMJE3-IT(5RC$6k&{1h7I5x0$`NG`j0YTn z^Bp`<&T``Pb4%bgVFtqRSBrc54N^50#ey=pN>8F+j3$C$Q93c>Oy!w?AR5#PWdmkF z?GC++EP>?!^oE2#V5$MG4j>oWq=$igX!^h~1E&{2RpK^)B7l>Cbm*o6E$4r($%$SD zo*vKmrv*$D01i+cs8!%u=*b_^>TMi_2IpcBAM ze+Ia9`_)NQ(;Z6?5Pbq=@fEbwm=^_S(!Tbb%@E9`mBu=3S zfBKnoQ}4nav;!TXp#26s1O#G^;j#vCXAN3_DS;r*0feDxH+-XN69Dg(Isui%$JcTWfePfgVVDU4x$0(%3`bcF_DC_rnlpSBYv zA+^AMGHD&gAO)kqNcdOY!&HCmP$Hl`hOY?xNEEbFBrLItrDG(*LQxAK&t? z-!T!Gr@;fh;JN;4z*xr%&^;MYfEGxHQ~-}(CxMs`xI;H!U4StkP!@*0KrTEZmIR*A z1XphmgJKpEC;@Z80v7yq!I~Kj-o=k6>i!;lkbnH6eh3J|>y~oVWT0hN~+q$pm`$-y%GdfT4k>2@*wz2)hEuDu7vGPZU6A zv4RM@0Ov~2Fh8(c2oDJ+@*})3kxc;X<-CJJg1w27h&W8)6cC!)IZfO75v36+n2!|@ znaX$Y4vXWUCz#sX%s0`{)K=BhFJW=x`?eCFVN^hHJ;0UK*!Iosf`yFj0LACTtjR%`|?M7QUw> z(U$gFblBv2PtR<2Q5hND3z@n193OTobI)HePI}Ly8c?7V6WDi6SgS+}?OK-FKTxM> zuuWnsse0VR=j|@TsM$A@qXnpbU*^ep?z+aFsnS<$+C5iv$j|-Mf;z2!v+QPP`FRS^=@Dfg*?#D?1phEWoNCja!N=K`fYY1e3gAqJgNWs9!Zeru^Sn7enQ@|Z*~VE*_D~x44f}dZ%`3ZetS^uMoKa^OpMs?S zy4K3K_+-(wzS3?Yl7_jP4q*egCBF51b--owPO;BtMm7a-ll~}z0;Cw}bJ)W|?G$nh*QVB`JGJi`|0k6@G4JGBb>*6o5=}99#+L_rQhaMd+ z!GGM;@2BLikT+-F>52jS=#YjRL}c^FPula4h0Ydc)MceNxvAYxm+VswUor6fkV)(v zfeXWz`Lr)jcoTsI!qent!@Vo1?UN+x4 zA?$>1(oxeC7Cy5yms1LHgiT7}Y!Sfm3INATHvKR0J3zXCZ~>e1Ky+0#iK>7?5jw|n zVX`B@@oW&l^O$kK@eKbQ$NP=C!+#j4boQ25Hgr(4v2eZktyR=x0|yQ^^eefql$TBG zmgn#feQE74te$a><$fM@z`4!OTP#tl^kJ)4T7EzzYGi%I;&8UcuRAaH9x>I-a<3X6 z+iq5E*=x)ynzLzL^zD89U75m*h+3g4##u#}s4{f}&m~^Y@3Z6DmuIftRC->_l+EaV z{fU7gtve3i!?y@vI!* zJyvmf)`=(58ZLD#EvBPJX^zKQmfgK^EDk4%;D_q=TPW=1Me!&dEqP?3dZT0W_YBL- zmE6`^du2Jh8`3m5hHFVmjgQ(=jLPr=g-B?@EQH2#9x!a~V+-t{$f)a!gKjL{(%SBrU9f+!V)J9ufk?^?>~ReZb-; zoJ?305$+cPWz+Pv8G`6)0_H{3)6@XGOJgFc0i%B>Tm7SzR5iufO%(C2lgM37AS~V! zX&-1Pb~oh4_4ls=zGVyZKY2VqJaNux^#YB7?~g7mwvoLrEbJ zM7uMJ0(}dSR?1v{C7G)_HUfpNj2WTQXN%O>fa0!Z5nP&S>5IWV~v;9?et8DheW11_ff=eQU{w*?0b z950~OpZOOCsDJbf;}y&*UWY8K(m1*HHLrSbspY5F9ub2}^;Pc~ALaUXyv zT@F>+{fL43(z8XSj(eYmo~t?WIp(A#<&)v7Me)r&+_U|!m+U2|j&a#tcD$+jbjhvr zp)X2#im)Y)PinSUtsKf+y!ZWww{M;%OKB~ram;;ZFS|+k08M;%Zw8yhP_NDBZH3J* z1xj|>Tob#sgOaJdE+}u#XYqITcYSZje0P($S+uQIu{y@f(WGeE&C&j1C&%tQjH!vb z$MAz=9W;&LuLm*(`d<6LC@WIAaBUtxFM0c(u92cKyaESVH{*S*)RJ@UJ&rHiqO(NY znn=PP-Mb|$x2s+_s%0YnhF@q7%DtQ9D&3NEmE+AO-fgx)yaF}`8|GT}$^{I{4v`ss+BZ(dE@?n!;pB-YwnykGzLN zTFg3b&+d=8j5~4ri^^lEE&Gmeei2Yyc(iY{r!3y=9NTJh^6G^)m5T>#29HO^baHBO z1c_6LQoXzm-OmcYJTvD%>Yel5PFQV29gB2qZ{{LJ|AyT=GMmym^Q4dQxb1ycbS&8~ zk$bJ`xyS&NMAp$E;q@Pd6XnjNw5}~RC#vT@e7ery9%|zn^Y)gMrW%nkUP@Yhu|Wl9 z;o9&1d0D;urTiy!?AY%%7$7uOHo(8%GWoZ#AC%ey1>@hrzY!fo3jqwAq=~?_rv{N8 z)kI+Q@7whM5%=C-7+CeV%VL-Eh5$9up4#50jeC~K+8u4_7O|1zd((cXed*C~gfQzh z+Z~5YAxFHG;PysL3*AAqz@qOaO<-AM1A$46-Zgc+7u&=nv*Yz(_BwoF+ zDK4y+wQo)vGi~K)TUF6kxfoY8dN6Re?>(i5X7-iIZO@d<)D({-+pbv7-G^2AvNk;( z3Eup{8Oa~pcsKj_OX=*5pKl3#U_WgiwETo=`hE-45_6wfigSHRv-@tdCM+o$O*%Bo zT#$pdKWT79^fz>_gdO`P6hC4%c>0m7*}2QA4*M%4qZbjQZsa}IPuyMTi8(33Q}y*z zUNyQ!#>(OQC`-d70vD5e9|qj}(C=~YU+#NnaBu!eCJeYY;O8hLAqR4ISzJOol8{Cf z{1y8x^g7`AmoG19{4qy`3zrm>99zv;cOgOlZ2nnmwBd!cUI!@K%kq^-R}t$&^|#Hzjt+rLv;PA2rr$FF_S zd(?P7vGs7V-tSQvn>#N$hjQ7tyi?kz5OwZ(HYLW-NIA`0+|>-)s99f2YPsQ}+oW zJ}(#JSIxP$Pe!`UxPM;%xnYYNDjl5~)TIi_7IGdguN>bVe6%OOd45Q3f?_!9tT&O; zb$PUUMTb*WYYkEhBRx+97YZD#D>r|K4;kO05m^20@v>{%WSe|y^CdRpy)g!=70x?q z`lO$otZeo=5$(Xzu}IDCNJeEz^x@+LSrK#Y@7gR7A)~HQ${t+cx=p^W;B8W~^xfBz zwoSQjET4QrlS5Lu;;#8$dmjAiP<9J(?swisSGP`UvBJ(V^?gQaD})1@1d7LrG^I-j zP3Z!V_#$Aq{e5Bxx(xUyDan)wx*#C~F4rbR)f`wN_cQ@C4oG>Y1k_waUSxW%5L^s0 zAH)&CVo*{}jbODqQF?iFra9Z$gtRBJrbCF+>7lf%LZ(`QT|EXC1)rPP8qzNc-|MiMCT;5?(kx_rNidJTrE+i~nrJc2BtjzJYHNcZFRn z-Tsw(eKlv<^JNx^;q5*$5!Ec{PGj}xt$}PwSk>Fo*-zT8x#m{M?$6$K$j-BCeT>cS zJEGqkwT|m1@BDI7{q10MaFVr5ha}%yORrVKN!mgN=5DY3_pgm$(Wh;@=ax|3R&(=d z&lBAE-eTdgkh|?4#X|!&Iyl+xd?i#!QwTw57`Z8&vl3|-A&@kSPG#HwwpsnxdWLB< z=8lL=L5(GHO-9(zfWjteh=s@pbpi|vI89BGrpr$hCVz18)pc1`JyPHO{hK8 zKCKa*`%$s@v*qSxE8EF5#re4pZ<%cf+2E)AK{Y?cCN{_Kz~x-FwxW%1$xZD0mwg{q zyU?{)&2X*P`^5^naW>cF_MBH#*z{74@3BzMopXziG*&wdYMp&%dTWKQa(Z0TlcPJ& zJl|lS&zt`|U+nejUJK2A1_?>W`CYQx*6|cR8Ma-oawyB>WNF^RnDU0SQ?s^yYoFz& zZQ_)!jL8tab&&t4Ep8)1lQW(gb~rSVCZ`F~)F*Kbby9K!kR%RhhsXy}xH{PaO~&Fd zV7MV}Qx5~Z6cqjZre2CJoS613j_^{CGOs-R>TdaCff<)&srOZmx9VNqf7g+{dZ>EE z`+Y|XXgmo()bSlGm0wJg&tmaKtGW;AyCTjc^EZTw5brAmkbLoOmUB^UWo zl1qRR+X;0QU7U;PYUxfB=hCD9P;qX1Mx^%hH3)@N6@gmHf9$dhvuKB?C&wox;1)>nOn4>{%T_5tM$0|GU--nOoczd^oUVXdZ7 zT5RPQI%q8g$XFHfe@9#3I=HnH|e*TKQ}p9hs9s zrOgqT%->dJ{Zi8u5*kL=W&vWJ6ud&}^?(;uL`N0TrHe#7nSBN#krjwNvWyuAA`zzS z__rGXA`rTs?01?72P*}pnvQ$&R>=);~(a3(Ej! zfTVLdc7)2=3dxogEpeto##&je32q`P9lM8o5BG*$Gbq0KRYP*Mcz>lB@G9bD3gv456{bf@xq4Q(D5CehYGb z)K8p0A>}V&{XnA4VEuEaSpRQ}#HS_!B9N@;Y9J&%hFnFP9wj0$`nOL~G|bOt1{i2& zfB|L(V9XtUH%8$XS3BAnTu$S+);c?M%1L_vVlm}_eiys)8dlvoILou~4cwC5IssSk zom}s9FYRHiyry>tEl6B^JC!HKd-KMO)pCIq`z-hN`>ne5IM2SCQ>CHee%ZWZu^bim zvYeY&&td8JiF~QCTmi5C;xM~i>v5CQ?wyy_un~v-K3os_FyF0Ec-ZXh6J75k!QQ0k zg9ToEs<#*J{`~Y28_ylLm=epmFL*8#2t-}TFnIgr={y&HDQiciqFBlk{QT3Ft2ze< zjdv#AUthgGS?s=H)i(E+skTXTh6>f4`_lDQk7+tJo;LiZar-#dpsKoJm+r<}`Baq= z8^@i}B>4utVDEVQvwQiDipnNkA3lpsPW$BXu5EeUwv5f^FG`2Ydx$8Vx}m6~E1#pc zM7woE)vjaWvWLoi20W$K_9$8Ad!+QryWf_!GF*Q7KiDrPbe?s9@m-eX?%N0d}UW+ z+JLnsa_I2(#{;hWE53GD`t;UkC#)a5J81R7a_%7krGtm!e5ud3tcmuhR!_ROa<5xm zl#!Jr1E9V$B(>e$xzY%)o`%(1kwqr_M}Jo8iV=V*eHih%p-%v?iT&7=pFDYGB# zvl-5+Ja1MIm~-pN-IQ&U;-x__9rhzXONgcnFMc^0{f=CJhUn=ht;2MS4T|b~3^CpK zj3A3m&#OaMiS4qfT8ImrEu?T@CPHirtP8A?E&sgK9}HhGZh>GP=&vRxI}b$DLqmf; z*{xzuZeX%oj@ThK%s80r7XLZ<|L@cvjwI}dz!Pu@*$CK7C+wV*yQyK3gha%M*&GHf ztoeJ*!O7b@#48NgqWA}SQewP9!_@r3gOG)j6<`o8NezO;Gy_--+T6V724W>0CncgX^m_Zfn@kL%V`V=G#2rizPfQ!Wu7EL9zO;q^+<`I{?z}<2 zF+a7;0%arR04GZ?DGvW&mz=D=#NmrOKA6pW^i{vDmh?7Q{@Ak$#lg1j54;t7l(KWI zc@4OR*i-LHHE4+RzH3x%aou;qQjhZr=cOx0k3Flt-zAi?%+yI&W1Zrh_^M&W&yQ5* z6Z~_kom2gSLk^t|Z&=8}dJwIwWJog-u=e4)c-(rVXGgqvh)|sAp~z2TaP~t@DTM5)La1{ykKwHq_k4s=N{-((XO+>H(i;cd>kCuzR<3iju`s>3xG68v zm6K`_FdnnNzBVXmZPW5F0iIa9n?#zhG(r=Wpo_Ss ziT&FIS?#NGUp#j#Gq@gXvG9yx)#a|k`Sv_QDFT?lvYb^+)Es6v_==C~l={KhlxkrV-~js#JDH?DO`dTxaX& zuiG-Vt{;eBcrj<>_<`_!-bFbaJ9^HB1{_aT7*lDTFSsKA%Tv62xOt1i{?2*tiKT-6 z?N?uTdtMdn`w(tfetw--0P&(sKsEA0?R~nitK_NXIR0g-S(aN=YTqRl%&7>KBwwc_ z?}|o$Nx0~cxn1j>Ntw>G79*WK;j^oGOj1AAhshs9J|??dF)cc=`lh}#df@fL+*i2e znXJn)uI{URb*Ydha1fyh6ix2Iuvj3V5ZDFMw$Bhy2*iV=^%ykvX8{Eb?ZC>#Bn5sT zqoARUf#Amo%xn69DkiE}9wpSzO2{-HHR% zPu5714EOZi>5<@2)w+A>uKLRd-P=6{f|ah!8BM01d+hnutX@$<&KFOaBfX`<$~)C= zO_lq2l$61{l@Uj3w=A|^xU8LTFRP(%{D{v*Y?jH!w{2GA!OwD=t4fDrl{ty;9@wz% zJe9&udKoQV*}v!Jf*0y0XAccO^sYUCt|xHpj=uTz{KX~{_f^7s(JZzy)=VMIbAYMd z-(8j7@tW_pg_!=qc>M-5u|`clmrX${e$U$E&#y}Fe003N<7JWC8ozdfjC9v~Ex96> z|5dxX$yFm1zaXlJwyK6EeMS0ju&euxy1{C+fW8`qCO-+8NWv~8VaJRGX#!#}xt>G| z6Mu6-YG-B1SdALn*{ge#eLN!q!~eu`)NaOd6nX^yspTl!^OR*gy;q*(7$vO38srxj zN{1YOeelKz@j@$0Z`rr8l|iD&@k@<9O=};Iym%K~d$n|*{L|6%g8>dJ+2<{znc%;i zvEO!Mcr|`YF5%j#(5p8fx@4VK{(9-4hP}l_3&!H(veu?Y z9}K$Hvv*YDt8Qn;@RbtItmFf=`{o?OEl#XCNzIedC7hIh<~{IfxNf7Dvpip{n%>ID zqIKo0Tli9i&w3u3bv?I}*F2Zn*mmoKB%;l45@wJgL?de z$aY}&{7+=_=$D^MEe?NrMA_&W5E50EaQzU+5xsK*SFU%`PEc-24A*QzOH#jxr7An< zRl7d8#T(>h|L3~nyRv{tm;FHi<(+R7g;|^ z9#zgQp5=qwJ{PWG_1J6u$eu0gVppXroKGHmXtE&NZr#1YTa7E8`afD(-~I@>IDX@~ z^%tHxciaAaNl{((^Q}%SYHxW8>_`vZawv-5Ilhr3$$s{McGqo>9go6OEWxCMdk^#h z_ows$sJ;hM+K)bks&>+6pS~YwpTC!-Pjg<;0OBCJHh|&0LXZBRS`_@@{MB$&uETt@ zy%m|-y`eaw%e#7Ck3#R&?l&h*v^T5>F#Fz!-J)idVY<|#-R-^_i=N2VQK2~8m!LIb zMM+UzdZGI0?(9?C)iD)E-7XdtUof6E`+bwwsZQb8YniwTu7-09&q$tlFuDW#VsFaz zGLCVcSsOnR)H#eg#$svB%yjMRr*7!C!-S^PLXN#%W zN+r-tJH+EyuxC%!TIX&KJQF4Gs^npgWS3NzPM(oLRMXM;F0HZFbe1s=&Sx@Qe5G4@ zF2y`6y?C;d=X%>(kHq(VL2r|05$Ax&{Eavj{q`CFyhxbFCL?Op%fkMUCpEdXcshVM0xc4kE4c zSF|<;rfcw+82h++3B)fvyz15S3q}3p{Wd{Q0`{HL+jVWL#W7t$nseQ@HE;UwA0YWB zw{)LcvP|Iu=WRWGEpPu_-*Z+4qhli^=JuZ%knM>s-%XY^n3ZoAFJWvNWT20BZLEyb z$R`naD>`2F3Ur8Qr(9Ah53C$5gfY}_c)%KfCw(Ya{PgB|&wig<)a zy3f|FDD#c?X_2{l+xx*GGaFxR|BBUh@2`GZd@282bnoYiOHSIgMXehYs2?MXLXGxT z=M1jQ?AG@U+2p@BAiRfu*YUsI4CTLG2AYq8!)J7I4@j7?G@v6Dk|lp&O8ZPTp=yR-CVdvOg!$$?V}e{1tJ~>t$20kaG%L$JDc5@ zp|X9S=JJ?bEV-m8v-IPg)bay~1jU+1{X7rn2JO)h{qFl>xn`h$agV_gfj6ygh~)i# ze$8F)vt3ucJKybm_r9H?QtOF2Bkn78vKc9+W-Hg-d`IHro}2tU*rPhbwl>%Cpq1n{|h(AYobd*%54 z(Nskb(CVT&Dyw5)ce702J>o*QkN_*SpEW#^T~E5b%8rg}-s7c5K% zW;P>WoW7@z)7^jXW|CoR^NY37bV(Tvt%1y$6r}*8E}j{}668nGmp$7GiH5JU9%Oh4 zWv0YQ?^$cR#pKIBkxm4c2Y!{s&~7uuNxgB)KiM@GuTnxo#lG;?>fFDlvViqzAR! zLSNQisQ$jg{-M+7BdMG&oU&$n*LKZT?I*N;^9$gAI`F3SW0hp()nFHb@?fn-k^H tKkm-#tGak!%EYdLh4bM1w$S?*0v|UyZBbvf+YFU9{K>B->@q9r{{fxH)^Pv; literal 0 HcmV?d00001 diff --git a/Bin/System.IdentityModel.Tokens.Jwt.dll.refresh b/Bin/System.IdentityModel.Tokens.Jwt.dll.refresh new file mode 100644 index 0000000000000000000000000000000000000000..e775ba7e5480dc048e4779c47dd367d4040e9f33 GIT binary patch literal 274 zcmbu2K?=e!5JlgKilBnH?MlIwx+{pbMN4B9+akTZ`jRV1n3>G~FZth3&YFTFJvA?T zLC%?xiiY5MsPy(xx0ETIHBXhuM!%E~+>$bIV#QMDsan$7ukw-IGdTyhI~f}jYC8AE pn%Mb1Dnakyy-jZKw&g96`D@19nx))^i?fp&Sfs>%|F6sr`~djbH8}tP literal 0 HcmV?d00001 diff --git a/Bin/System.IdentityModel.Tokens.Jwt.xml b/Bin/System.IdentityModel.Tokens.Jwt.xml new file mode 100644 index 000000000..808377f8e --- /dev/null +++ b/Bin/System.IdentityModel.Tokens.Jwt.xml @@ -0,0 +1,1433 @@ + + + + System.IdentityModel.Tokens.Jwt + + + +

+ Defines the inbound and outbound mapping for claim claim types from jwt to .net claim + + + + + Initializes static members of the class. + + + + + Gets the InboundClaimTypeMap used by JwtSecurityTokenHandler when producing claims from jwt. + + + + + Gets the OutboundClaimTypeMap is used by JwtSecurityTokenHandler to shorten claim types when creating a jwt. + + + + + Constants for Json Web tokens. + + + + + A URI that represents the JSON XML data type. + + When mapping json to .Net Claim(s), if the value was not a string (or an enumeration of strings), the ClaimValue will serialized using the current JSON serializer, a property will be added with the .Net type and the ClaimTypeValue will be set to 'JsonClaimValueType'. + + + + A URI that represents the JSON array XML data type. + + When mapping json to .Net Claim(s), if the value was not a string (or an enumeration of strings), the ClaimValue will serialized using the current JSON serializer, a property will be added with the .Net type and the ClaimTypeValue will be set to 'JsonClaimValueType'. + + + + A URI that represents the JSON null data type + + When mapping json to .Net Claim(s), we use empty string to represent the claim value and set the ClaimValueType to JsonNull + + + + Delegate that can be set on to control serialization of objects into JSON. + + Object to serialize + The serialized object. + + + + Delegate that can be set on to control deserialization JSON into objects. + + JSON to deserialize. + Type expected. + The deserialized object. + + + + Dictionary extensions for serializations + + + + + Gets or sets a to use when serializing objects to JSON. + + If 'value' is null. + + + + Gets or sets a to use when deserializing objects from JSON. + + If 'value' is null. + + + + Serializes an object to JSON. + + The object to serialize + The object as JSON. + + + + Deserialzes JSON into an instance of type T. + + The object type. + The JSON to deserialze. + A new instance of type T. + + + + Deserialzes JSON into an instance of . + + The JSON to deserialze. + A new instance . + + + + Deserialzes JSON into an instance of . + + The JSON to deserialze. + A new instance . + + + + Constants for Json Web tokens. + + + + + Short header type. + + + + + Long header type. + + + + + Short token type. + + + + + Long token type. + + + + + JWS - Token format: 'header.payload.signature'. Signature is optional, but '.' is required. + + + + + JWE - Token format: 'protectedheader.encryptedkey.iv.cyphertext.authenticationtag'. + + + + + The number of parts in a JWE token. + + + + + The number of parts in a JWS token. + + + + + The maximum number of parts in a JWT. + + + + + JWE header alg indicating a shared symmetric key is directly used as CEK. + + + + + Initializes a new instance of which contains JSON objects representing the cryptographic operations applied to the JWT and optionally any additional properties of the JWT. + The member names within the JWT Header are referred to as Header Parameter Names. + These names MUST be unique and the values must be (s). The corresponding values are referred to as Header Parameter Values. + + + + + Initializes a new instance of the class. Default string comparer . + + + + + Initializes a new instance of . + With the Header Parameters: + { { typ, JWT }, { alg, SigningCredentials.Algorithm } } + + used creating a JWS Compact JSON. + + + + Initializes a new instance of . + With the Header Parameters: + { { typ, JWT }, { alg, EncryptingCredentials.Alg }, { enc, EncryptingCredentials.Enc } } + + used creating a JWE Compact JSON. + If 'encryptingCredentials' is null. + + + + Initializes a new instance of . + With the Header Parameters: + { { typ, JWT }, { alg, SigningCredentials.Algorithm } } + + used when creating a JWS Compact JSON. + provides a mapping for the 'alg' value so that values are within the JWT namespace. + + + + Initializes a new instance of . + With the Header Parameters: + { { typ, JWT }, { alg, SigningCredentials.Algorithm } } + + used when creating a JWS Compact JSON. + provides a mapping for the 'alg' value so that values are within the JWT namespace. + If 'signingCredentials' is null. + + + + Gets the signature algorithm that was used to create the signature. + + If the signature algorithm is not found, null is returned. + + + + Gets the content mime type (Cty) of the token. + + If the content mime type is not found, null is returned. + + + + Gets the encryption algorithm (Enc) of the token. + + If the content mime type is not found, null is returned. + + + + Gets the passed in the constructor. + + This value may be null. + + + + Gets the iv of symmetric key wrap. + + + + + Gets the key identifier for the security key used to sign the token + + + + + Gets the passed in the constructor. + + This value may be null. + + + + Gets the mime type (Typ) of the token. + + If the mime type is not found, null is returned. + + + + Gets the thumbprint of the certificate used to sign the token + + + + + Deserializes Base64UrlEncoded JSON into a instance. + + Base64url encoded JSON to deserialize. + An instance of . + Use to customize JSON serialization. + + + + Encodes this instance as Base64UrlEncoded JSON. + + Base64UrlEncoded JSON. + Use to customize JSON serialization. + + + + Deserialzes JSON into a instance. + + The JSON to deserialize. + An instance of . + Use to customize JSON serialization. + + + + Gets a standard claim from the header. + A standard claim is either a string or a value of another type serialized in JSON format. + + The key of the claim. + The standard claim string; or null if not found. + + + + Serializes this instance to JSON. + + This instance as JSON. + Use to customize JSON serialization. + + + + List of header parameter names see: http://tools.ietf.org/html/rfc7519#section-5. + + + + + see:https://tools.ietf.org/html/rfc7515#section-4.1.1 + + + + + see:https://tools.ietf.org/html/rfc7515#section-4.1.10 + also:https://tools.ietf.org/html/rfc7519#section-5.2 + + + + + see:https://tools.ietf.org/html/rfc7516#section-4.1.2 + + + + + see:https://tools.ietf.org/html/rfc7518#section-4.7.1.1 + + + + + see:https://tools.ietf.org/html/rfc7515#section-4.1.2 + + + + + see:https://tools.ietf.org/html/rfc7515#section-4.1.3 + + + + + see:https://tools.ietf.org/html/rfc7515#section-4.1.4 + + + + + see:https://tools.ietf.org/html/rfc7515#section-4.1.9 + also:https://tools.ietf.org/html/rfc7519#section-5.1 + + + + + see:https://tools.ietf.org/html/rfc7515#section-4.1.6 + + + + + see:https://tools.ietf.org/html/rfc7515#page-12 + + + + + see:https://tools.ietf.org/html/rfc7515#section-4.1.5 + + + + + see:https://tools.ietf.org/html/rfc7516#section-4.1.3 + + + + + Initializes a new instance of which contains JSON objects representing the claims contained in the JWT. Each claim is a JSON object of the form { Name, Value }. + + + + + Initializes a new instance of the class with no claims. Default string comparer . + Creates a empty + + + + + Initializes a new instance of the class with . Default string comparer . + The claims to add. + + + + + Initializes a new instance of the class with claims added for each parameter specified. Default string comparer . + + If this value is not null, a { iss, 'issuer' } claim will be added. + If this value is not null, a { aud, 'audience' } claim will be added + If this value is not null then for each a { 'Claim.Type', 'Claim.Value' } is added. If duplicate claims are found then a { 'Claim.Type', List<object> } will be created to contain the duplicate values. + If notbefore.HasValue is 'true' a { nbf, 'value' } claim is added. + If expires.HasValue is 'true' a { exp, 'value' } claim is added. + + + + Initializes a new instance of the class with claims added for each parameter specified. Default string comparer . + + If this value is not null, a { iss, 'issuer' } claim will be added. + If this value is not null, a { aud, 'audience' } claim will be added + If this value is not null then for each a { 'Claim.Type', 'Claim.Value' } is added. If duplicate claims are found then a { 'Claim.Type', List<object> } will be created to contain the duplicate values. + If notbefore.HasValue is 'true' a { nbf, 'value' } claim is added. + If expires.HasValue is 'true' a { exp, 'value' } claim is added. + If issuedAt.HasValue is 'true' a { iat, 'value' } claim is added. + Comparison is set to + The 4 parameters: 'issuer', 'audience', 'notBefore', 'expires' take precednece over (s) in 'claims'. The values in 'claims' will be overridden. + If 'expires' <= 'notbefore'. + + + + Gets the 'value' of the 'actor' claim { actort, 'value' }. + + If the 'actor' claim is not found, null is returned. + + + + Gets the 'value' of the 'acr' claim { acr, 'value' }. + + If the 'acr' claim is not found, null is returned. + + + + Gets the 'value' of the 'amr' claim { amr, 'value' } as list of strings. + + If the 'amr' claim is not found, an empty enumerable is returned. + + + + Gets the 'value' of the 'auth_time' claim { auth_time, 'value' }. + + If the 'auth_time' claim is not found OR could not be converted to , null is returned. + + + + Gets the 'value' of the 'audience' claim { aud, 'value' } as a list of strings. + + If the 'audience' claim is not found, an empty enumerable is returned. + + + + Gets the 'value' of the 'azp' claim { azp, 'value' }. + + If the 'azp' claim is not found, null is returned. + + + + Gets 'value' of the 'c_hash' claim { c_hash, 'value' }. + + If the 'c_hash' claim is not found, null is returned. + + + + Gets the 'value' of the 'expiration' claim { exp, 'value' }. + + If the 'expiration' claim is not found OR could not be converted to , null is returned. + + + + Gets the 'value' of the 'JWT ID' claim { jti, 'value' }. + + If the 'JWT ID' claim is not found, null is returned. + + + + Gets the 'value' of the 'Issued At' claim { iat, 'value' }. + + If the 'Issued At' claim is not found OR cannot be converted to null is returned. + + + + Gets the 'value' of the 'issuer' claim { iss, 'value' }. + + If the 'issuer' claim is not found, null is returned. + + + + Gets the 'value' of the 'expiration' claim { nbf, 'value' }. + + If the 'notbefore' claim is not found OR could not be converted to , null is returned. + + + + Gets the 'value' of the 'nonce' claim { nonce, 'value' }. + + If the 'nonce' claim is not found, null is returned. + + + + Gets the 'value' of the 'subject' claim { sub, 'value' }. + + If the 'subject' claim is not found, null is returned. + + + + Gets the 'value' of the 'notbefore' claim { nbf, 'value' } converted to a assuming 'value' is seconds since UnixEpoch (UTC 1970-01-01T0:0:0Z). + + If the 'notbefore' claim is not found, then is returned. Time is returned as UTC. + + + + Gets the 'value' of the 'expiration' claim { exp, 'value' } converted to a assuming 'value' is seconds since UnixEpoch (UTC 1970-01-01T0:0:0Z). + + If the 'expiration' claim is not found, then is returned. + + + + Gets a for each JSON { name, value }. + + Each (s) returned will have the translated according to the mapping found in . Adding and removing to will affect the value of the . + and will be set to the value of ( if null). + + + + Adds a JSON object representing the to the + + { 'Claim.Type', 'Claim.Value' } is added. If a JSON object is found with the name == then a { 'Claim.Type', List<object> } will be created to contain the duplicate values. + See For details on how is applied. + 'claim' is null. + + + + Adds a number of to the as JSON { name, value } pairs. + + For each a JSON pair { 'Claim.Type', 'Claim.Value' } is added. If duplicate claims are found then a { 'Claim.Type', List<object> } will be created to contain the duplicate values. + + Any in the that is null, will be ignored. + 'claims' is null. + + + + Gets the DateTime using the number of seconds from 1970-01-01T0:0:0Z (UTC) + + Claim in the payload that should map to an integer. + If the claim is not found, the function returns: DateTime.MinValue + + If an overflow exception is thrown by the runtime. + The DateTime representation of a claim. + + + + Serializes this instance to JSON. + + This instance as JSON. + Use to customize JSON serialization. + + + + Encodes this instance as Base64UrlEncoded JSON. + + Base64UrlEncoded JSON. + Use to customize JSON serialization. + + + + Deserializes Base64UrlEncoded JSON into a instance. + + base64url encoded JSON to deserialize. + An instance of . + Use to customize JSON serialization. + + + + Deserialzes JSON into a instance. + + The JSON to deserialize. + An instance of . + Use to customize JSON serialization. + + + + List of registered claims from different sources + http://tools.ietf.org/html/rfc7519#section-4 + http://openid.net/specs/openid-connect-core-1_0.html#IDToken + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://openid.net/specs/openid-connect-core-1_0.html#IDToken + + + + + http://openid.net/specs/openid-connect-core-1_0.html#IDToken + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://openid.net/specs/openid-connect-core-1_0.html#IDToken + + + + + http://openid.net/specs/openid-connect-core-1_0.html#IDToken + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://openid.net/specs/openid-connect-core-1_0.html#CodeIDToken + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://openid.net/specs/openid-connect-frontchannel-1_0.html#OPLogout + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + A designed for representing a JSON Web Token (JWT). + + + + + Initializes a new instance of from a string in JWS Compact serialized format. + + A JSON Web Token that has been serialized in JWS Compact serialized format. + 'jwtEncodedString' is null. + 'jwtEncodedString' contains only whitespace. + 'jwtEncodedString' is not in JWS Compact serialized format. + + The contents of this have not been validated, the JSON Web Token is simply decoded. Validation can be accomplished using + + + + + Initializes a new instance of the class where the contains the crypto algorithms applied to the encoded and . The jwtEncodedString is the result of those operations. + + Contains JSON objects representing the cryptographic operations applied to the JWT and optionally any additional properties of the JWT + Contains JSON objects representing the claims contained in the JWT. Each claim is a JSON object of the form { Name, Value } + base64urlencoded JwtHeader + base64urlencoded JwtPayload + base64urlencoded JwtSignature + 'header' is null. + 'payload' is null. + 'rawSignature' is null. + 'rawHeader' or 'rawPayload' is null or whitespace. + + + + Initializes an instance of where the contains the crypto algorithms applied to the innerToken . + + Defines cryptographic operations applied to the 'innerToken'. + + base64urlencoded key + base64urlencoded JwtHeader + base64urlencoded initialization vector. + base64urlencoded encrypted innerToken + base64urlencoded authentication tag. + 'header' is null. + 'innerToken' is null. + 'rawHeader' is null. + 'rawEncryptedKey' is null. + 'rawInitialVector' is null or empty. + 'rawCiphertext' is null or empty. + 'rawAuthenticationTag' is null or empty. + + + + Initializes a new instance of the class where the contains the crypto algorithms applied to the encoded and . The jwtEncodedString is the result of those operations. + + Contains JSON objects representing the cryptographic operations applied to the JWT and optionally any additional properties of the JWT + Contains JSON objects representing the claims contained in the JWT. Each claim is a JSON object of the form { Name, Value } + 'header' is null. + 'payload' is null. + + + + Initializes a new instance of the class specifying optional parameters. + + If this value is not null, a { iss, 'issuer' } claim will be added. + If this value is not null, a { aud, 'audience' } claim will be added + If this value is not null then for each a { 'Claim.Type', 'Claim.Value' } is added. If duplicate claims are found then a { 'Claim.Type', List<object> } will be created to contain the duplicate values. + If expires.HasValue a { exp, 'value' } claim is added. + If notbefore.HasValue a { nbf, 'value' } claim is added. + The that will be used to sign the . See for details pertaining to the Header Parameter(s). + If 'expires' <= 'notbefore'. + + + + Gets the 'value' of the 'actor' claim { actort, 'value' }. + + If the 'actor' claim is not found, null is returned. + + + + Gets the list of 'audience' claim { aud, 'value' }. + + If the 'audience' claim is not found, enumeration will be empty. + + + + Gets the (s) for this token. + If this is a JWE token, this property only returns the encrypted claims; + the unencrypted claims should be read from the header seperately. + + (s) returned will NOT have the translated according to + + + + Gets the Base64UrlEncoded associated with this instance. + + + + + Gets the Base64UrlEncoded associated with this instance. + + + + + Gets the associated with this instance if the token is signed. + + + + + Gets the 'value' of the 'JWT ID' claim { jti, ''value' }. + + If the 'JWT ID' claim is not found, an empty string is returned. + + + + Gets the 'value' of the 'issuer' claim { iss, 'value' }. + + If the 'issuer' claim is not found, an empty string is returned. + + + + Gets the associated with this instance. + Note that if this JWT is nested ( != null, this property represnts the payload of the most inner token. + This property can be null if the content type of the most inner token is unrecognized, in that case + the content of the token is the string returned by PlainText property. + + + + + Gets the associated with this instance. + + + + + Gets the original raw data of this instance when it was created. + + The original JSON Compact serialized format passed to one of the two constructors + or + + + + Gets the original raw data of this instance when it was created. + + The original JSON Compact serialized format passed to one of the two constructors + or + + + + Gets the original raw data of this instance when it was created. + + The original JSON Compact serialized format passed to one of the two constructors + or + + + + Gets the original raw data of this instance when it was created. + + The original JSON Compact serialized format passed to one of the two constructors + or + + + + Gets the original raw data of this instance when it was created. + + The original JSON Compact serialized format passed to one of the two constructors + or + + + + Gets the original raw data of this instance when it was created. + + The original JSON Compact serialized format passed to one of the two constructors + or + + + + Gets the original raw data of this instance when it was created. + + The original JSON Compact serialized format passed to one of the two constructors + or + + + + Gets the original raw data of this instance when it was created. + + The original JSON Compact serialized format passed to one of the two constructors + or + + + + Gets the s for this instance. + + + + + Gets the signature algorithm associated with this instance. + + If there is a associated with this instance, a value will be returned. Null otherwise. + + + + Gets the to use when writing this token. + + + + + Gets the to use when writing this token. + + + + + Gets or sets the that signed this instance. + + .ValidateSignature(...) sets this value when a is used to successfully validate a signature. + + + + Gets the "value" of the 'subject' claim { sub, 'value' }. + + If the 'subject' claim is not found, null is returned. + + + + Gets the 'value' of the 'notbefore' claim { nbf, 'value' } converted to a assuming 'value' is seconds since UnixEpoch (UTC 1970-01-01T0:0:0Z). + + If the 'notbefore' claim is not found, then is returned. + + + + Gets the 'value' of the 'expiration' claim { exp, 'value' } converted to a assuming 'value' is seconds since UnixEpoch (UTC 1970-01-01T0:0:0Z). + + If the 'expiration' claim is not found, then is returned. + + + + Serializes the and + + A string containing the header and payload in JSON format. + + + + Decodes the string into the header, payload and signature. + + the tokenized string. + the original token. + + + + Decodes the payload and signature from the JWS parts. + + Parts of the JWS including the header. + Assumes Header has already been set. + + + + Decodes the payload and signature from the JWE parts. + + Parts of the JWE including the header. + Assumes Header has already been set. + + + + A designed for creating and validating Json Web Tokens. See: http://tools.ietf.org/html/rfc7519 and http://www.rfc-editor.org/info/rfc7515 + + + + + Default claim type mapping for inbound claims. + + + + + Default value for the flag that determines whether or not the InboundClaimTypeMap is used. + + + + + Default claim type mapping for outbound claims. + + + + + Default claim type filter list. + + + + + Default JwtHeader algorithm mapping + + + + + Static initializer for a new object. Static initializers run before the first instance of the type is created. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the property which is used when determining whether or not to map claim types that are extracted when validating a . + If this is set to true, the is set to the JSON claim 'name' after translating using this mapping. Otherwise, no mapping occurs. + The default value is true. + + + + + Gets or sets the which is used when setting the for claims in the extracted when validating a . + The is set to the JSON claim 'name' after translating using this mapping. + The default value is ClaimTypeMapping.InboundClaimTypeMap. + + 'value' is null. + + + + Gets or sets the which is used when creating a from (s). + The JSON claim 'name' value is set to after translating using this mapping. + The default value is ClaimTypeMapping.OutboundClaimTypeMap + + This mapping is applied only when using or . Adding values directly will not result in translation. + 'value' is null. + + + + Gets the outbound algorithm map that is passed to the constructor. + + + + Gets or sets the used to filter claims when populating a claims form a . + When a is validated, claims with types found in this will not be added to the . + The default value is ClaimTypeMapping.InboundClaimFilter. + + 'value' is null. + + + + Gets or sets the property name of the will contain the original JSON claim 'name' if a mapping occurred when the (s) were created. + See for more information. + + If .IsNullOrWhiteSpace('value') is true. + + + + Gets or sets the property name of the will contain .Net type that was recognized when JwtPayload.Claims serialized the value to JSON. + See for more information. + + If .IsNullOrWhiteSpace('value') is true. + + + + Returns a value that indicates if this handler can validate a . + + 'true', indicating this instance can validate a . + + + + Gets the value that indicates if this instance can write a . + + 'true', indicating this instance can write a . + + + + Gets the type of the . + + The type of + + + + Determines if the string is a well formed Json Web Token (JWT). + see: http://tools.ietf.org/html/rfc7519 + + String that should represent a valid JWT. + Uses matching one of: + JWS: @"^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$" + JWE: (dir): @"^[A-Za-z0-9-_]+\.\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$" + JWE: (wrappedkey): @"^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]$" + + + 'false' if the token is null or whitespace. + 'false' if token.Length is greater than . + 'true' if the token is in JSON compact serialization format. + + + + + Returns a Json Web Token (JWT). + + A that contains details of contents of the token. + A JWS and JWE can be returned. + If is provided, then a JWE will be created. + If is provided then a JWS will be created. + If both are provided then a JWE with an embedded JWS will be created. + + + + + Creates a JWT in 'Compact Serialization Format'. + + The issuer of the token. + The audience for this token. + The source of the (s) for this token. + The notbefore time for this token. + The expiration time for this token. + The issue time for this token. + Contains cryptographic material for generating a signature. + If is not null, then a claim { actort, 'value' } will be added to the payload. See for details on how the value is created. + See for details on how the HeaderParameters are added to the header. + See for details on how the values are added to the payload. + Each in the will map by applying . Modifying could change the outbound JWT. + If is provided, then a JWS will be created. + + A Base64UrlEncoded string in 'Compact Serialization Format'. + + + + Creates a JWT in 'Compact Serialization Format'. + + The issuer of the token. + The audience for this token. + The source of the (s) for this token. + Translated into 'epoch time' and assigned to 'nbf'. + Translated into 'epoch time' and assigned to 'exp'. + Translated into 'epoch time' and assigned to 'iat'. + Contains cryptographic material for signing. + Contains cryptographic material for encrypting. + If is not null, then a claim { actort, 'value' } will be added to the payload. for details on how the value is created. + See for details on how the HeaderParameters are added to the header. + See for details on how the values are added to the payload. + Each in the will map by applying . Modifying could change the outbound JWT. + + A Base64UrlEncoded string in 'Compact Serialization Format'. + If 'expires' <= 'notBefore'. + + + + Creates a Json Web Token (JWT). + + A that contains details of contents of the token. + is used to sign . + + + + Creates a + + The issuer of the token. + The audience for this token. + The source of the (s) for this token. + The notbefore time for this token. + The expiration time for this token. + The issue time for this token. + Contains cryptographic material for generating a signature. + Contains cryptographic material for encrypting the token. + If is not null, then a claim { actort, 'value' } will be added to the payload. for details on how the value is created. + See for details on how the HeaderParameters are added to the header. + See for details on how the values are added to the payload. + Each on the added will have translated according to the mapping found in + . Adding and removing to will affect the name component of the Json claim. + is used to sign . + is used to encrypt or . + + A . + If 'expires' <= 'notBefore'. + + + + Creates a + + The issuer of the token. + The audience for this token. + The source of the (s) for this token. + The notbefore time for this token. + The expiration time for this token. + The issue time for this token. + Contains cryptographic material for generating a signature. + If is not null, then a claim { actort, 'value' } will be added to the payload. for details on how the value is created. + See for details on how the HeaderParameters are added to the header. + See for details on how the values are added to the payload. + Each on the added will have translated according to the mapping found in + . Adding and removing to will affect the name component of the Json claim. + is used to sign . + + A . + If 'expires' <= 'notBefore'. + + + + Creates a Json Web Token (JWT). + + A that contains details of contents of the token. + is used to sign . + + + + Converts a string into an instance of . + + A 'JSON Web Token' (JWT) in JWS or JWE Compact Serialization Format. + A + 'token' is null or empty. + 'token.Length' $gt; . + + If the 'token' is in JWE Compact Serialization format, only the protected header will be deserialized. + This method is unable to decrypt the payload. Use to obtain the payload. + + + + Converts a string into an instance of . + + A 'JSON Web Token' (JWT) in JWS or JWE Compact Serialization Format. + A + 'token' is null or empty. + 'token.Length' is greater than . + + If the 'token' is in JWE Compact Serialization format, only the protected header will be deserialized. + This method is unable to decrypt the payload. Use to obtain the payload. + + + + Deserializes token with the provided . + + . + The current . + The + This method is not current supported. + + + + Reads and validates a 'JSON Web Token' (JWT) encoded as a JWS or JWE in Compact Serialized Format. + + the JWT encoded as JWE or JWS + Contains validation parameters for the . + The that was validated. + is null or whitespace. + is null. + .Length $gt; MamimumTokenSizeInBytes. + does not have 3 or 5 parts. + returns false. + was a JWE was not able to be decrypted. + 'kid' header claim is not null AND decryption fails. + 'enc' header claim is null or empty. + 'exp' claim is < DateTime.UtcNow. + is null or whitespace and is null. Audience is not validated if is set to false. + 'aud' claim did not match either or one of . + 'nbf' claim is > 'exp' claim. + .signature is not properly formatted. + 'exp' claim is missing and is true. + is not null and expirationTime.HasValue is false. When a TokenReplayCache is set, tokens require an expiration time. + 'nbf' claim is > DateTime.UtcNow. + could not be added to the . + is found in the cache. + A from the JWT. Does not include claims found in the JWT header. + + Many of the exceptions listed above are not thrown directly from this method. See to examin the call graph. + + + + + Validates the JSON payload of a . + + The token to validate. + Contains validation parameters for the . + A from the jwt. Does not include the header claims. + + + + Serializes a into a JWT in Compact Serialization Format. + + to serialize. + + The JWT will be serialized as a JWE or JWS. + will be used to create the JWT. If there is an inner token, the inner token's payload will be used. + If either or .SigningCredentials are set, the JWT will be signed. + If is set, a JWE will be created using the JWT above as the plaintext. + + 'token' is null. + 'token' is not a not . + both and are set. + both and .EncryptingCredentials are set. + if is set and is not set. + A JWE or JWS in 'Compact Serialization Format'. + + + + Obtains a and validates the signature. + + Bytes to validate. + Signature to compare against. + to use. + Crypto algorithm to use. + Priority will be given to over . + 'true' if signature is valid. + + + + Validates that the signature, if found or required, is valid. + + A JWS token. + that contains signing keys. + If 'jwt' is null or whitespace. + If 'validationParameters' is null. + If a signature is not found and is true. + If the 'token' has a key identifier and none of the (s) provided result in a validated signature. + This can indicate that a key refresh is required. + If after trying all the (s), none result in a validated signature AND the 'token' does not have a key identifier. + A that has the signature validated if token was signed. + If the 'token' is signed, the signature is validated even if is false. + If the 'token' signature is validated, then the will be set to the key that signed the 'token'.It is the responsibility of to set the + + + + Creates a from a . + + The to use as a source. + The value to set + Contains parameters for validating the token. + A containing the . + + + + Creates the 'value' for the actor claim: { actort, 'value' } + + as actor. + representing the actor. + If is not null: +   If 'type' is 'string', return as string. +   if 'type' is 'BootstrapContext' and 'BootstrapContext.SecurityToken' is 'JwtSecurityToken' +     if 'JwtSecurityToken.RawData' != null, return RawData. +     else return . +   if 'BootstrapContext.Token' != null, return 'Token'. + default: new ( ( actor.Claims ). + + 'actor' is null. + + + + Determines if the audiences found in a are valid. + + The audiences found in the . + The being validated. + required for validation. + See for additional details. + + + + Validates the lifetime of a . + + The value of the 'nbf' claim if it exists in the 'jwtToken'. + The value of the 'exp' claim if it exists in the 'jwtToken'. + The being validated. + required for validation. + for additional details. + + + + Determines if the issuer found in a is valid. + + The issuer to validate + The that is being validated. + required for validation. + The issuer to use when creating the (s) in the . + for additional details. + + + + Determines if a is already validated. + + The value of the 'exp' claim if it exists in the '. + The that is being validated. + required for validation. + + + + Returns a to use when validating the signature of a token. + + The representation of the token that is being validated. + The that is being validated. + A required for validation. + Returns a to use for signature validation. + If key fails to resolve, then null is returned + + + + Returns a to use when decryption a JWE. + + The the token that is being decrypted. + The that is being decrypted. + A required for validation. + Returns a to use for signature validation. + If key fails to resolve, then null is returned + + + + Decrypts a JWE and returns the clear text + + the JWE that contains the cypher text. + contains crypto material. + the decoded / cleartext contents of the JWE. + if 'jwtToken' is null. + if 'validationParameters' is null. + if 'jwtToken.Header.enc' is null or empty. + if 'jwtToken.Header.kid' is not null AND decryption fails. + if the JWE was not able to be decrypted. + + + + Validates the is an expected value. + + The that signed the . + The to validate. + The current . + If the is a then the X509Certificate2 will be validated using the CertificateValidator. + + + + Serializes to XML a token of the type handled by this instance. + + The XML writer. + A token of type . + + + + Log messages and codes + + + + From 1b89476500aacc500feddfd3a0ea3f53fcf2cb61 Mon Sep 17 00:00:00 2001 From: JORGE LUIS CAUDILLO ESPARZA Date: Wed, 29 Jul 2020 13:11:22 -0700 Subject: [PATCH 23/23] --- Bin/Microsoft.IdentityModel.JsonWebTokens.dll | Bin 0 -> 58584 bytes ...ft.IdentityModel.JsonWebTokens.dll.refresh | Bin 0 -> 298 bytes Bin/Microsoft.IdentityModel.JsonWebTokens.xml | 736 ++++ Bin/Microsoft.IdentityModel.Logging.dll | Bin 0 -> 32272 bytes ...icrosoft.IdentityModel.Logging.dll.refresh | Bin 0 -> 274 bytes Bin/Microsoft.IdentityModel.Logging.xml | 398 ++ Bin/Microsoft.IdentityModel.Tokens.dll | Bin 0 -> 156368 bytes ...Microsoft.IdentityModel.Tokens.dll.refresh | Bin 0 -> 270 bytes Bin/Microsoft.IdentityModel.Tokens.xml | 3367 +++++++++++++++++ Bin/Microsoft.Owin.xml | 3316 ++++++++++++++++ 10 files changed, 7817 insertions(+) create mode 100644 Bin/Microsoft.IdentityModel.JsonWebTokens.dll create mode 100644 Bin/Microsoft.IdentityModel.JsonWebTokens.dll.refresh create mode 100644 Bin/Microsoft.IdentityModel.JsonWebTokens.xml create mode 100644 Bin/Microsoft.IdentityModel.Logging.dll create mode 100644 Bin/Microsoft.IdentityModel.Logging.dll.refresh create mode 100644 Bin/Microsoft.IdentityModel.Logging.xml create mode 100644 Bin/Microsoft.IdentityModel.Tokens.dll create mode 100644 Bin/Microsoft.IdentityModel.Tokens.dll.refresh create mode 100644 Bin/Microsoft.IdentityModel.Tokens.xml create mode 100644 Bin/Microsoft.Owin.xml diff --git a/Bin/Microsoft.IdentityModel.JsonWebTokens.dll b/Bin/Microsoft.IdentityModel.JsonWebTokens.dll new file mode 100644 index 0000000000000000000000000000000000000000..1c17c5a22fbd8f7978ae2e0170940dcb10f30954 GIT binary patch literal 58584 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 M_qGjnkC^xW0~EF#ivR!s literal 0 HcmV?d00001 diff --git a/Bin/Microsoft.IdentityModel.JsonWebTokens.dll.refresh b/Bin/Microsoft.IdentityModel.JsonWebTokens.dll.refresh new file mode 100644 index 0000000000000000000000000000000000000000..db176b08bab9460ed157a9297796328a8e5cfa2b GIT binary patch literal 298 zcmb`DK?=e!5JmrqM9_k`?MlI&;wB)PMhy*3G3~<3t1oi~2{RM^e=`&E{j}Q3>7=5d z7ul)RRkJ!pB~C^u}^xao+~8(Z)iVnr + + + Microsoft.IdentityModel.JsonWebTokens + + + + + Constants for Json Web tokens. + + + + + A URI that represents the JSON XML data type. + + When mapping json to .Net Claim(s), if the value was not a string (or an enumeration of strings), the ClaimValue will serialized using the current JSON serializer, a property will be added with the .Net type and the ClaimTypeValue will be set to 'JsonClaimValueType'. + + + + A URI that represents the JSON array XML data type. + + When mapping json to .Net Claim(s), if the value was not a string (or an enumeration of strings), the ClaimValue will serialized using the current JSON serializer, a property will be added with the .Net type and the ClaimTypeValue will be set to 'JsonClaimValueType'. + + + + A URI that represents the JSON null data type + + When mapping json to .Net Claim(s), we use empty string to represent the claim value and set the ClaimValueType to JsonNull + + + + A designed for representing a JSON Web Token (JWT). + + + + + Initializes a new instance of from a string in JWS or JWE Compact serialized format. + + A JSON Web Token that has been serialized in JWS or JWE Compact serialized format. + 'jwtEncodedString' is null or empty. + 'jwtEncodedString' is not in JWS or JWE Compact serialization format. + + The contents of the returned have not been validated, the JSON Web Token is simply decoded. Validation can be accomplished using the validation methods in + + + + + Initializes a new instance of the class where the header contains the crypto algorithms applied to the encoded header and payload. + + A string containing JSON which represents the cryptographic operations applied to the JWT and optionally any additional properties of the JWT. + A string containing JSON which represents the claims contained in the JWT. Each claim is a JSON object of the form { Name, Value }. + 'header' is null. + 'payload' is null. + + + + Gets the 'value' of the 'actort' claim { actort, 'value' }. + + If the 'actort' claim is not found, an empty string is returned. + + + + Gets the 'value' of the 'alg' claim { alg, 'value' }. + + If the 'alg' claim is not found, an empty string is returned. + + + + Gets the list of 'aud' claim { aud, 'value' }. + + If the 'aud' claim is not found, enumeration will be empty. + + + + Gets the AuthenticationTag from the original raw data of this instance when it was created. + + The original JSON Compact serialized format passed into the constructor. + + + + Gets the Ciphertext from the original raw data of this instance when it was created. + + The original JSON Compact serialized format passed into the constructor. + + + + Gets a for each JSON { name, value }. + + + + + Gets the 'value' of the 'cty' claim { cty, 'value' }. + + If the 'cty' claim is not found, an empty string is returned. + + + + Gets the 'value' of the 'enc' claim { enc, 'value' }. + + If the 'enc' value is not found, an empty string is returned. + + + + Gets the EncryptedKey from the original raw data of this instance when it was created. + + The original JSON Compact serialized format passed into the constructor. + + + + Represents the cryptographic operations applied to the JWT and optionally any additional properties of the JWT. + + + + + Gets the 'value' of the 'jti' claim { jti, ''value' }. + + If the 'jti' claim is not found, an empty string is returned. + + + + Gets the InitializationVector from the original raw data of this instance when it was created. + + The original JSON Compact serialized format passed into the constructor. + + + + Gets the associated with this instance. + + + + + Gets the 'value' of the 'iat' claim { iat, 'value' } converted to a assuming 'value' is seconds since UnixEpoch (UTC 1970-01-01T0:0:0Z). + + If the 'iat' claim is not found, then is returned. + + + + Gets the 'value' of the 'iss' claim { iss, 'value' }. + + If the 'iss' claim is not found, an empty string is returned. + + + + Gets the 'value' of the 'kid' claim { kid, 'value' }. + + If the 'kid' claim is not found, an empty string is returned. + + + + Represents the JSON payload. + + + + + Gets the EncodedHeader from the original raw data of this instance when it was created. + + The original JSON Compact serialized format passed into the constructor. + + + + Gets the EncodedPayload from the original raw data of this instance when it was created. + + The original JSON Compact serialized format passed into the constructor. + + + + Gets the EncodedSignature from the original raw data of this instance when it was created. + + The original JSON Compact serialized format passed into the constructor. + + + + Gets the original raw data of this instance when it was created. + + + + + Not implemented. + + + + + Not implemented. + + + + + Gets the 'value' of the 'sub' claim { sub, 'value' }. + + If the 'sub' claim is not found, an empty string is returned. + + + + Gets the 'value' of the 'typ' claim { typ, 'value' }. + + If the 'typ' claim is not found, an empty string is returned. + + + + Gets the 'value' of the 'nbf' claim { nbf, 'value' } converted to a assuming 'value' is seconds since UnixEpoch (UTC 1970-01-01T0:0:0Z). + + If the 'nbf' claim is not found, then is returned. + + + + Gets the 'value' of the 'exp' claim { exp, 'value' } converted to a assuming 'value' is seconds since UnixEpoch (UTC 1970-01-01T0:0:0Z). + + If the 'exp' claim is not found, then is returned. + + + + Gets the 'value' of the 'x5t' claim { x5t, 'value' }. + + If the 'x5t' claim is not found, an empty string is returned. + + + + Gets the 'value' of the 'zip' claim { zip, 'value' }. + + If the 'zip' claim is not found, an empty string is returned. + + + + Decodes the string into the header, payload and signature. + + the tokenized string. + the original token. + + + + Decodes the payload and signature from the JWE parts. + + Parts of the JWE including the header. + Assumes Header has already been set. + + + + Decodes the payload and signature from the JWS parts. + + Parts of the JWS including the header. + Assumes Header has already been set. + + + + Gets the 'value' corresponding to the provided key from the JWT payload { key, 'value' }. + + If the key has no corresponding value, returns null. + + + + Gets the 'value' corresponding to the provided key from the JWT header { key, 'value' }. + + If the key has no corresponding value, returns null. + + + + A designed for creating and validating Json Web Tokens. + See: http://tools.ietf.org/html/rfc7519 and http://www.rfc-editor.org/info/rfc7515. + + + + + Gets the type of the . + + The type of + + + + Determines if the string is a well formed Json Web Token (JWT). + see: http://tools.ietf.org/html/rfc7519 + + String that should represent a valid JWT. + Uses matching: + JWS: @"^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$" + JWE: (dir): @"^[A-Za-z0-9-_]+\.\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$" + JWE: (wrappedkey): @"^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]$" + + + 'false' if the token is null or whitespace. + 'false' if token.Length is greater than . + 'true' if the token is in JSON compact serialization format. + + + + + Returns a value that indicates if this handler can validate a . + + 'true', indicating this instance can validate a . + + + + Creates a JWS (Json Web Signature). + + A string containing JSON which represents the JWT token payload. + Defines the security key and algorithm that will be used to sign the JWS. + A JWS in Compact Serialization Format. + + + + Creates a JWE (Json Web Encryption). + + A string containing JSON which represents the JWT token payload. + Defines the security key and algorithm that will be used to sign the JWT. + Defines the security key and algorithm that will be used to encrypt the JWT. + A JWE in compact serialization format. + + + + Creates a JWE (Json Web Encryption). + + A string containing JSON which represents the JWT token payload. + Defines the security key and algorithm that will be used to sign the JWT. + Defines the security key and algorithm that will be used to encrypt the JWT. + Defines the compression algorithm that will be used to compress the JWT token payload. + A JWE in compact serialization format. + + + + Compress a JWT token string. + + + + if 'token' is null. + if 'algorithm' is null. + if the compression algorithm is not supported. + Compressed JWT token bytes. + + + + Decompress JWT token bytes. + + + + if 'tokenBytes' is null. + if 'algorithm' is null. + if the decompression algorithm is not supported. + Decompressed JWT token + + + + Decrypts a JWE and returns the clear text + + the JWE that contains the cypher text. + contains crypto material. + the decoded / cleartext contents of the JWE. + if 'jwtToken' is null. + if 'validationParameters' is null. + if 'jwtToken.Enc' is null or empty. + if decompression failed. + if 'jwtToken.Kid' is not null AND decryption fails. + if the JWE was not able to be decrypted. + + + + Returns a to use when validating the signature of a token. + + The that is being validated. + A required for validation. + Returns a to use for signature validation. + If key fails to resolve, then null is returned + + + + Returns a to use when decrypting a JWE. + + The the token that is being decrypted. + The that is being decrypted. + A required for validation. + Returns a to use for signature validation. + If key fails to resolve, then null is returned + + + + Converts a string into an instance of . + + A 'JSON Web Token' (JWT) in JWS or JWE Compact Serialization Format. + A + 'token' is null or empty. + 'token.Length' is greater than . + If the 'token' is in JWE Compact Serialization format, only the protected header will be deserialized. + This method is unable to decrypt the payload. Use to obtain the payload. + + + + Converts a string into an instance of . + + A 'JSON Web Token' (JWT) in JWS or JWE Compact Serialization Format. + A + 'token' is null or empty. + 'token.Length' is greater than . + + + + Validates a JWS or a JWE. + + A 'JSON Web Token' (JWT) in JWS or JWE Compact Serialization Format. + A required for validation. + A + + + + Validates the JWT signature. + + + + + Obtains a and validates the signature. + + Bytes to validate. + Signature to compare against. + to use. + Crypto algorithm to use. + Priority will be given to over . + 'true' if signature is valid. + + + + Constants for Json Web Tokens. + + + + + Short header type. + + + + + Long header type. + + + + + Short token type. + + + + + Long token type. + + + + + JWS - Token format: 'header.payload.signature'. Signature is optional, but '.' is required. + + + + + JWE - Token format: 'protectedheader.encryptedkey.iv.cyphertext.authenticationtag'. + + + + + The number of parts in a JWE token. + + + + + The number of parts in a JWS token. + + + + + The maximum number of parts in a JWT. + + + + + JWE header alg indicating a shared symmetric key is directly used as CEK. + + + + + List of header parameter names see: http://tools.ietf.org/html/rfc7519#section-5. + + + + + see:https://tools.ietf.org/html/rfc7515#section-4.1.1 + + + + + see:https://tools.ietf.org/html/rfc7515#section-4.1.10 + also:https://tools.ietf.org/html/rfc7519#section-5.2 + + + + + see:https://tools.ietf.org/html/rfc7516#section-4.1.2 + + + + + see:https://tools.ietf.org/html/rfc7518#section-4.7.1.1 + + + + + see:https://tools.ietf.org/html/rfc7515#section-4.1.2 + + + + + see:https://tools.ietf.org/html/rfc7515#section-4.1.3 + + + + + see:https://tools.ietf.org/html/rfc7515#section-4.1.4 + + + + + see:https://tools.ietf.org/html/rfc7515#section-4.1.9 + also:https://tools.ietf.org/html/rfc7519#section-5.1 + + + + + see:https://tools.ietf.org/html/rfc7515#section-4.1.6 + + + + + see:https://tools.ietf.org/html/rfc7515#page-12 + + + + + see:https://tools.ietf.org/html/rfc7515#section-4.1.5 + + + + + see:https://tools.ietf.org/html/rfc7516#section-4.1.3 + + + + + List of registered claims from different sources + http://tools.ietf.org/html/rfc7519#section-4 + http://openid.net/specs/openid-connect-core-1_0.html#IDToken + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://openid.net/specs/openid-connect-core-1_0.html#IDToken + + + + + http://openid.net/specs/openid-connect-core-1_0.html#IDToken + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://openid.net/specs/openid-connect-core-1_0.html#IDToken + + + + + http://openid.net/specs/openid-connect-core-1_0.html#IDToken + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://openid.net/specs/openid-connect-core-1_0.html#CodeIDToken + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://openid.net/specs/openid-connect-frontchannel-1_0.html#OPLogout + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + http://tools.ietf.org/html/rfc7519#section-4 + + + + + A class which contains useful methods for processing JWT tokens. + + + + + Regex that is used to figure out if a token is in JWS format. + + + + + Regex that is used to figure out if a token is in JWE format. + + + + + Produces a signature over the 'input'. + + String to be signed + The that contain crypto specs used to sign the token. + The bse64urlendcoded signature over the bytes obtained from UTF8Encoding.GetBytes( 'input' ). + 'input' or 'signingCredentials' is null. + + + + Generates key bytes. + + + + + Gets all decryption keys. + + + + + Gets the DateTime using the number of seconds from 1970-01-01T0:0:0Z (UTC) + + Claim in the payload that should map to an integer, float, or string. + The payload that contains the desired claim value. + If the claim is not found, the function returns: DateTime.MinValue + + If the value of the claim cannot be parsed into a long. + The DateTime representation of a claim. + + + + Log messages and codes + + + + + A class which contains the result of a token validation operation. + + + + + The validated security token. + + + + diff --git a/Bin/Microsoft.IdentityModel.Logging.dll b/Bin/Microsoft.IdentityModel.Logging.dll new file mode 100644 index 0000000000000000000000000000000000000000..60646a6da4241b4aff351d1b445db26132882e18 GIT binary patch literal 32272 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 literal 0 HcmV?d00001 diff --git a/Bin/Microsoft.IdentityModel.Logging.xml b/Bin/Microsoft.IdentityModel.Logging.xml new file mode 100644 index 000000000..2b45eddf6 --- /dev/null +++ b/Bin/Microsoft.IdentityModel.Logging.xml @@ -0,0 +1,398 @@ + + + + Microsoft.IdentityModel.Logging + + + + + Event source based logger to log different events. + + + + + Static logger that is exposed externally. An external application or framework can hook up a listener to this event source to log data in a custom way. + + + + + Flag which indicates whether or not PII is shown in logs. False by default. + + + + + String that is used in place of any arguments to log messages if the 'ShowPII' flag is set to false. + + + + + Indicates whether or the log message header (contains library version, date/time, and PII debugging information) has been written. + + + + + The log message that indicates the current library version. + + + + + The log message that indicates the date. + + + + + The log message that is shown when PII is off. + + + + + The log message that is shown when PII is off. + + + + + Writes an event log by using the provided string argument and current UTC time. + No level filtering is done on the event. + + The log message. + No level filtering. + + + + Writes an event log by using the provided string argument, current UTC time and the provided arguments list. + + The log message. + An object array that contains zero or more objects to format. + + + + Writes a verbose event log by using the provided string argument and current UTC time. + + The log message. + + + + Writes a verbose event log by using the provided string argument, current UTC time and the provided arguments list. + + The log message. + An object array that contains zero or more objects to format. + + + + Writes an information event log by using the provided string argument and current UTC time. + + The log message. + + + + Writes an information event log by using the provided string argument, current UTC time and the provided arguments list. + + The log message. + An object array that contains zero or more objects to format. + + + + Writes a warning event log by using the provided string argument and current UTC time. + + The log message. + + + + Writes a warning event log by using the provided string argument, current UTC time and the provided arguments list. + + The log message. + An object array that contains zero or more objects to format. + + + + Writes an error event log by using the provided string argument and current UTC time. + + The log message. + + + + Writes an error event log by using the provided string argument, current UTC time and the provided arguments list. + + The log message. + An object array that contains zero or more objects to format. + + + + Writes a critical event log by using the provided string argument and current UTC time. + + The log message. + + + + Writes a critical event log by using the provided string argument, current UTC time and the provided arguments list. + + The log message. + An object array that contains zero or more objects to format. + + + + Writes an exception log by using the provided event identifer, exception argument, string argument and current UTC time. + + + + The log message. + + + + Writes an exception log by using the provided event identifer, exception argument, string argument, arguments list and current UTC time. + + + + The log message. + An object array that contains zero or more objects to format. + + + + Minimum log level to log events. Default is Warning. + + + + + Helper class for logging. + + + + + Logs an exception using the event source logger and returns new exception. + + argument that is null or empty. + EventLevel is set to Error. + + + + Logs an exception using the event source logger and returns new typed exception. + + message to log. + EventLevel is set to Error. + + + + Logs an argument exception using the event source logger and returns new typed exception. + + Identifies the argument whose value generated the ArgumentException. + message to log. + EventLevel is set to Error. + + + + Logs an exception using the event source logger and returns new typed exception. + + Format string of the log message. + An object array that contains zero or more objects to format. + EventLevel is set to Error. + + + + Logs an argument exception using the event source logger and returns new typed exception. + + Identifies the argument whose value generated the ArgumentException. + Format string of the log message. + An object array that contains zero or more objects to format. + EventLevel is set to Error. + + + + Logs an exception using the event source logger and returns new typed exception. + + the inner to be added to the outer exception. + message to log. + EventLevel is set to Error. + + + + Logs an argument exception using the event source logger and returns new typed exception. + + Identifies the argument whose value generated the ArgumentException. + the inner to be added to the outer exception. + message to log. + EventLevel is set to Error. + + + + Logs an exception using the event source logger and returns new typed exception. + + the inner to be added to the outer exception. + Format string of the log message. + An object array that contains zero or more objects to format. + EventLevel is set to Error. + + + + Logs an argument exception using the event source logger and returns new typed exception. + + Identifies the argument whose value generated the ArgumentException. + the inner to be added to the outer exception. + Format string of the log message. + An object array that contains zero or more objects to format. + EventLevel is set to Error. + + + + Logs an exception using the event source logger and returns new typed exception. + + Identifies the level of an event to be logged. + message to log. + + + + Logs an argument exception using the event source logger and returns new typed exception. + + Identifies the level of an event to be logged. + Identifies the argument whose value generated the ArgumentException. + message to log. + + + + Logs an exception using the event source logger and returns new typed exception. + + Identifies the level of an event to be logged. + Format string of the log message. + An object array that contains zero or more objects to format. + + + + Logs an argument exception using the event source logger and returns new typed exception. + + Identifies the level of an event to be logged. + Identifies the argument whose value generated the ArgumentException. + Format string of the log message. + An object array that contains zero or more objects to format. + + + + Logs an exception using the event source logger and returns new typed exception. + + Identifies the level of an event to be logged. + the inner to be added to the outer exception. + message to log. + + + + Logs an argument exception using the event source logger and returns new typed exception. + + Identifies the level of an event to be logged. + Identifies the argument whose value generated the ArgumentException. + the inner to be added to the outer exception. + message to log. + + + + Logs an exception using the event source logger and returns new typed exception. + + Identifies the level of an event to be logged. + the inner to be added to the outer exception. + Format string of the log message. + An object array that contains zero or more objects to format. + + + + Logs an argument exception using the event source logger and returns new typed exception. + + Identifies the level of an event to be logged. + Identifies the argument whose value generated the ArgumentException. + the inner to be added to the outer exception. + Format string of the log message. + An object array that contains zero or more objects to format. + + + + Logs an exception using the event source logger. + + The exception to log. + + + + Logs an exception using the event source logger. + + Identifies the level of an event to be logged. + The exception to log. + + + + Logs an information event. + + The log message. + An object array that contains zero or more objects to format. + + + + Logs a verbose event. + + The log message. + An object array that contains zero or more objects to format. + + + + Logs a warning event. + + The log message. + An object array that contains zero or more objects to format. + + + + Logs an exception using the event source logger and returns new typed exception. + + Identifies the level of an event to be logged. + Identifies the argument whose value generated the ArgumentException. + the inner to be added to the outer exception. + Format string of the log message. + An object array that contains zero or more objects to format. + + + + Formats the string using InvariantCulture + + Format string. + Format arguments. + Formatted string. + + + + Log messages and codes for Microsoft.IdentityModel.Logging + + + + + Event listener that writes logs to a file or a fileStream provided by user. + + + + + Name of the default log file, excluding its path. + + + + + Initializes a new instance of that writes logs to text file. + + + + + Initializes a new instance of that writes logs to text file. + + location of the file where log messages will be written. + + + + Initializes a new instance of that writes logs to text file. + + StreamWriter where logs will be written. + + + + Called whenever an event has been written by an event source for which the event listener has enabled events. + + + + + + Releases all resources used by the current instance of the class. + + + + diff --git a/Bin/Microsoft.IdentityModel.Tokens.dll b/Bin/Microsoft.IdentityModel.Tokens.dll new file mode 100644 index 0000000000000000000000000000000000000000..67cef9cb9cbe2196adb787057235eb73d25a37d2 GIT binary patch literal 156368 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 C;PvMK literal 0 HcmV?d00001 diff --git a/Bin/Microsoft.IdentityModel.Tokens.dll.refresh b/Bin/Microsoft.IdentityModel.Tokens.dll.refresh new file mode 100644 index 0000000000000000000000000000000000000000..12542a8e9a5a6a9fcaafce3c0714996be093e883 GIT binary patch literal 270 zcmbu4OA5k35JcaJM9_e^&B}#4-33G^QA0u!%w*x^)i-km8TvC-)m`-WQ?jSx%uK_} zTv2jmp{AwxjUuyokqv4pYr`axw22Sud!8AIT-Z^_Orn9#{7|2?M>hti)8xpV$clqL n4TF7ayw!{u>E%xLU1n#0g|RW#*|p_n9b_Zh?DyaHI^X&OIuSJ0 literal 0 HcmV?d00001 diff --git a/Bin/Microsoft.IdentityModel.Tokens.xml b/Bin/Microsoft.IdentityModel.Tokens.xml new file mode 100644 index 000000000..531569363 --- /dev/null +++ b/Bin/Microsoft.IdentityModel.Tokens.xml @@ -0,0 +1,3367 @@ + + + + Microsoft.IdentityModel.Tokens + + + + + This adapter abstracts the 'RSA' differences between versions of .Net targets. + + + + + Calls and + + + + + The following code determines if RSACng is available on the .Net framework that is installed. + + + + + Base class for a Security Key that contains Asymmetric key material. + + + + + This must be overridden to get a bool indicating if a private key exists. + + true if it has a private key; otherwise, false. + + + + Gets the status of the private key. + + 'Exists' if private key exists for sure; 'DoesNotExist' if private key doesn't exist for sure; 'Unknown' if we cannot determine. + + + + Enum for the existence of private key + + + + + private key exists for sure + + + + + private key doesn't exist for sure + + + + + unable to determine the existence of private key + + + + + Provides signature and verification operations for Asymmetric Algorithms using a . + + + + + Mapping from algorithm to minimum .KeySize when creating signatures. + + + + + Mapping from algorithm to minimum .KeySize when verifying signatures. + + + + + Initializes a new instance of the class used to create and verify signatures. + + The that will be used for signature operations. + The signature algorithm to apply. + + + + Initializes a new instance of the class used to create and verify signatures. + + The that will be used for signature operations. + The signature algorithm to apply. + If this is required to create signatures then set this to true. + + Creating signatures requires that the has access to a private key. + Verifying signatures (the default), does not require access to the private key. + + is null. + is null or empty. + is true and there is no private key. + If and algorithm pair are not supported. + + willCreateSignatures is true and .KeySize is less than the size corresponding to the given algorithm in . + + + .KeySize is less than the size corresponding to the algorithm in . Note: this is always checked. + + If the runtime is unable to create a suitable cryptographic provider. + + + + Gets the mapping from algorithm to the minimum .KeySize for creating signatures. + + + + + Gets the mapping from algorithm to the minimum .KeySize for verifying signatures. + + + + + Creating a Signature requires the use of a . + This method returns the type of the HashAlgorithm (as a string) + that describes the to use when generating a Signature. + + The SignatureAlgorithm in use. + if is null or whitespace. + if is not supported. + + + + This method is here, just to keep the #if out of the constructor. + + + + + + + + + Produces a signature over the 'input' using the and algorithm passed to . + + The bytes to be signed. + A signature over the input. + if is null. + if .Length == 0. + If has been called. + Sign is thread safe. + + + + Validates that an asymmetric key size is of sufficient size for a SignatureAlgorithm. + + The asymmetric key to validate. + Algorithm for which this key will be used. + Whether they key will be used for creating signatures. + if is null. + if is null or empty. + if .KeySize is less than the minimum + acceptable size. + + for minimum signing sizes. + for minimum verifying sizes. + + + + + Verifies that the over using the + and specified by this + are consistent. + + The bytes to generate the signature over. + The value to verify against. + true if signature matches, false otherwise. + is null or has length == 0. + is null or has length == 0. + If has been called. + Verify is thread safe. + + + + Calls to release managed resources. + + true, if called from Dispose(), false, if invoked inside a finalizer. + + + + Encodes and Decodes strings as Base64Url encoding. + + + + + The following functions perform base64url encoding which differs from regular base64 encoding as follows + * padding is skipped so the pad character '=' doesn't have to be percent encoded + * the 62nd and 63rd regular base64 encoding characters ('+' and '/') are replace with ('-' and '_') + The changes make the encoding alphabet file and URL safe. + + string to encode. + Base64Url encoding of the UTF8 bytes. + + + + Converts a subset of an array of 8-bit unsigned integers to its equivalent string representation that is encoded with base-64-url digits. Parameters specify + the subset as an offset in the input array, and the number of elements in the array to convert. + + An array of 8-bit unsigned integers. + An offset in inArray. + The number of elements of inArray to convert. + The string representation in base 64 url encodingof length elements of inArray, starting at position offset. + 'inArray' is null. + offset or length is negative OR offset plus length is greater than the length of inArray. + + + + Converts a subset of an array of 8-bit unsigned integers to its equivalent string representation that is encoded with base-64-url digits. Parameters specify + the subset as an offset in the input array, and the number of elements in the array to convert. + + An array of 8-bit unsigned integers. + The string representation in base 64 url encodingof length elements of inArray, starting at position offset. + 'inArray' is null. + offset or length is negative OR offset plus length is greater than the length of inArray. + + + + Converts the specified string, which encodes binary data as base-64-url digits, to an equivalent 8-bit unsigned integer array. + base64Url encoded string. + UTF8 bytes. + + + + Decodes the string from Base64UrlEncoded to UTF8. + + string to decode. + UTF8 string. + + + + Constants for compression algorithms. + + + + + Compression provider factory for compression and decompression. + + + + + Static constructor that initializes the default . + + + + + Default constructor for . + + + + + Constructor that creates a deep copy of given object. + + to copy from. + + + + Returns the default instance. + + + + + Extensibility point for custom compression support application wide. + + + + + Answers if an algorithm is supported. + + the name of the crypto algorithm. + true if the algorithm is supported, false otherwise. + + + + Returns a for a specific algorithm. + + the decompression algorithm. + a . + + + + Definition of cache for crypto providers + + + + + Returns the cache key to use when looking up an entry into the cache for a + + the to create the key for. + the cache key to use for finding a . + + + + Returns the 'key' that will be used to find a crypto provider in this cache. + + the key that is used to by the crypto provider. + the algorithm that is used by the crypto provider. + the typeof the crypto provider obtained by calling object.GetType(). + the cache key to use for finding a crypto provider. + + + + Trys to adds a to this cache. + + to cache. + true if the was added, false if the cache already contained the + + + + Trys to find a in this cache. + + the key that is used to by the crypto provider. + the algorithm that is used by the crypto provider. + the typeof the crypto provider obtained by calling object.GetType(). + a bool to indicate if the will be used to sign. + the if found. + true if a was found, false otherwise. + + + + Trys to remove a from this cache. + + to remove. + true if the was removed, false if the was not found. + + + + Creates cryptographic operators by specifying a 's and algorithms. + + + + + Returns the default instance. + + + + + Gets or sets the default value for caching + + + + + Static constructor that initializes the default . + + + + + Default constructor for . + + + + + Constructor that creates a deep copy of given object. + + to copy from. + + + + Gets the + + + + + Extensibility point for creating custom cryptographic operators. + + By default, if set, will be called before creating cryptographic operators. + If true is returned, then will be called. The will throw if the + Cryptographic operator returned is not of the correct type. + + + + Gets or sets a bool controlling if should be cached. + + + + + Creates an instance of for a specific <SecurityKey, Algorithm>. + + the to use. + the algorithm to use. + an instance of + 'key' is null. + 'algorithm' is null or empty. + 'key' is not a . + 'algorithm, key' pair is not supported. + + + + Creates an instance of for a specific <SecurityKey, Algorithm>. + + the to use. + the algorithm to use. + an instance of + 'key' is null. + 'algorithm' is null or empty. + If and algorithm pair are not supported. + + When finished with the call . + + + + + Creates an instance of for a specific <SecurityKey, Algorithm>. + + the to use. + the algorithm to use. + an instance of + 'key' is null. + 'algorithm' is null or empty. + If and algorithm pair are not supported. + + When finished with the call . + + + + + Creates a that supports the and algorithm. + + The to use for signing. + The algorithm to use for signing. + 'key' is null. + 'algorithm' is null or empty. + ' is too small. + is too small. + is not a or a . + + AsymmetricSignatureProviders require access to a PrivateKey for Signing. + When finished with the call . + + + + + Returns a instance supports the and algorithm. + + The to use for signing. + The algorithm to use for verifying. + 'key' is null. + 'algorithm' is null or empty. + is too small. + is too small. + ' is not a or a . + When finished with the call . + + + + Returns a for a specific algorithm. + + the name of the hash algorithm to create. + A + When finished with the call . + 'algorithm' is null or empty. + 'algorithm' is not supported. + + + + Returns a for a specific algorithm. + + the keyed hash algorithm to create. + bytes to use to create the Keyed Hash + A + When finished with the call . + 'algorithm' is null or empty. + 'algorithm' is not supported. + + + + Answers if an algorithm is supported + + the name of the cryptographic algorithm + + + + + Checks if an 'algorithm, key' pair is supported. + + the algorithm to check. + the . + true if 'algorithm, key' pair is supported. + + + + When finished with a call this method for cleanup. The default behavior is to call + + to be released. + + + + When finished with a call this method for cleanup."/> + + to be released. + + + + When finished with a call this method for cleanup."/> + + to be released. + + + + When finished with a call this method for cleanup. The default behavior is to call + + to be released. + + + + Helper class for adding DateTimes and Timespans. + + + + + Add a DateTime and a TimeSpan. + The maximum time is DateTime.MaxTime. It is not an error if time + timespan > MaxTime. + Just return MaxTime. + + Initial value. + to add. + as the sum of time and timespan. + + + + Gets the Maximum value for a DateTime specifying kind. + + DateTimeKind to use. + DateTime of specified kind. + + + + Gets the Minimum value for a DateTime specifying kind. + + DateTimeKind to use. + DateTime of specified kind. + + + + Ensures that DataTime is UTC. + + to convert. + + + + + Ensures that DateTime is UTC. + + to convert. + + + + + A compression provider that supports compression and decompression using the algorithm. + + + + + Initializes a new instance of the class used to compress and decompress used the algorithm. + + + + + Initializes a new instance of the class used to compress and decompress used the algorithm. + The compression level to use when compressing. + + + + + Gets the compression algorithm. + + + + + Specifies whether compression should emphasize speed or compression size. + Set to by default. + + + + + Decompress the value using DEFLATE algorithm. + + the bytes to decompress. + the decompressed bytes. + + + + Compress the value using the DEFLATE algorithm. + + the bytes to compress. + the compressed bytes. + + + + Answers if a compression algorithm is supported. + + the name of the compression algorithm. + true if the compression algorithm is supported, false otherwise. + + + + Represents a ECDsa security key. + + + + + Returns a new instance of . + + + + + + instance used to initialize the key. + + + + + Gets a bool indicating if a private key exists. + + true if it has a private key; otherwise, false. + + + + Gets an enum indicating if a private key exists. + + 'Exists' if private key exists for sure; 'DoesNotExist' if private key doesn't exist for sure; 'Unknown' if we cannot determine. + + + + Gets key size. + + + + + A class for properties that are used for token encryption. + + + + + Initializes a new instance of the class. + + . + A key wrap algorithm to use when encrypting a session key. + Data encryption algorithm to apply. + if 'certificate' is null. + if 'alg' is null or empty. + if 'enc' is null or empty. + + + + Initializes a new instance of the class. + + to use when encrypting a session key. + A key wrap algorithm to use when encrypting a session key. + Data encryption algorithm to apply. + if 'key' is null. + if 'alg' is null or empty. + if 'enc' is null or empty. + + + + Initializes a new instance of the class. + + Used in scenarios when a key represents a 'shared' symmetric key. + For example, SAML 2.0 Assertion will be encrypted using a provided symmetric key + which won't be serialized to a SAML token. + + to apply. + Data encryption algorithm to apply. + If the is not a . + if 'enc' is null or empty. + + + + Gets the key wrap algorithm used for session key encryption. + + + + + Gets the data encryption algorithm. + + + + + Users can override the default with this property. This factory will be used for creating encryption providers. + + + + + Gets the used for encryption. + + + + + Provides authenticated encryption and decryption services. + + + + + Initializes a new instance of the class used for encryption and decryption. + The that will be used for crypto operations. + The encryption algorithm to apply. + 'key' is null. + 'algorithm' is null or whitespace. + key size is not large enough. + 'algorithm' is not supported. + a symmetricSignatureProvider is not created. + + + + + Gets the encryption algorithm that is being used. + + + + + Gets or sets a user context for a . + + This is null by default. This can be used by applications for extensibility scenarios. + + + + Gets the that is being used. + + + + + Encrypts the 'plaintext' + + the data to be encrypted. + will be combined with iv and ciphertext to create an authenticationtag. + containing ciphertext, iv, authenticationtag. + plaintext is null or empty. + authenticationData is null or empty. + AES crypto operation threw. See inner exception for details. + + + + Encrypts the 'plaintext' + + the data to be encrypted. + will be combined with iv and ciphertext to create an authenticationtag. + initialization vector for encryption. + containing ciphertext, iv, authenticationtag. + is null or empty. + is null or empty. + AES crypto operation threw. See inner exception for details. + + + + Decrypts ciphertext into plaintext + + the encrypted text to decrypt. + the authenticateData that is used in verification. + the initialization vector used when creating the ciphertext. + the authenticationTag that was created during the encyption. + decrypted ciphertext + is null or empty. + is null or empty. + is null or empty. + is null or empty. + signature over authenticationTag fails to verify. + AES crypto operation threw. See inner exception. + + + + Checks if an 'key, algorithm' pair is supported + + the + the algorithm to check. + true if 'key, algorithm' pair is supported. + + + + The algorithm parameter logically defines a HMAC algorithm. + This method returns the HMAC to use. + + + + + + + Called to obtain the byte[] needed to create a + + that will be used to obtain the byte[]. + [] that is used to populated the KeyedHashAlgorithm. + if is null. + if a byte[] can not be obtained from SecurityKey. + and are supported. + For a .Key is returned + For a Base64UrlEncoder.DecodeBytes is called with if == JsonWebAlgorithmsKeyTypes.Octet + + + + + Checks that the key has sufficient length + + that contains bytes. + the algorithm to apply. + if is null. + if is null or empty. + if is not a supported algorithm. + + + + Contains the results of operation. + + + + + Initializes a new + + the used during + protected text. + the initialization vector used. + the bytes that need be passed to . + + + + Gets the . + + + + + Gets the Ciphertext. + + + + + Gets the initialization vector. + + + + + Gets the authentication tag + + + + + Provides Wrap key and Unwrap key services. + + + + + Gets the KeyWrap algorithm that is being used. + + + + + Gets or sets a user context for a . + + This is null by default. This can be used by runtimes or for extensibility scenarios. + + + + Gets the that is being used. + + + + + Calls and + + + + + Can be over written in descendants to dispose of internal components. + + true, if called from Dispose(), false, if invoked inside a finalizer + + + + Unwrap a key. + + key to unwrap. + Unwrapped key. + + + + Wrap a key. + + the key to be wrapped + wrapped key. + + + + Provides RSA Wrap key and Unwrap key services. + + + + + Initializes a new instance of used for wrapping and un-wrappping keys. + These keys are usually symmetric session keys that are wrapped using the recipients public key. + The that will be used for cryptographic operations. + The KeyWrap algorithm to apply. + Whether this is required to un-wrap keys. If true, the private key is required. + 'key' is null. + 'algorithm' is null. + The key size doesn't match the algorithm. + If and algorithm pair are not supported. + Failed to create RSA algorithm with provided key and algorithm. + + + + + Gets the KeyWrap algorithm that is being used. + + + + + Gets or sets a user context for a . + + This is null by default. This is for use by the application and not used by this SDK. + + + + Gets the that is being used. + + + + + Disposes of internal components. + + true, if called from Dispose(), false, if invoked inside a finalizer. + + + + Checks if an algorithm is supported. + + The that will be used for crypto operations. + The KeyWrap algorithm to apply. + true if the algorithm is supported; otherwise, false. + + + + Unwrap a key using RSA decryption. + + the bytes to unwrap. + Unwrapped key + 'keyBytes' is null or length == 0. + If has been called. + Failed to unwrap the wrappedKey. + If the internal RSA algorithm is null. + + + + Wrap a key using RSA encryption. + + the key to be wrapped + A wrapped key + 'keyBytes' is null or has length == 0. + If has been called. + Failed to wrap the 'keyBytes'. + If the internal RSA algorithm is null. + + + + Provides Wrap key and Unwrap key services. + + + + + Initializes a new instance of the class used for wrap key and unwrap key. + The that will be used for crypto operations. + The KeyWrap algorithm to apply. + 'key' is null. + 'algorithm' is null. + If and algorithm pair are not supported. + The cannot be converted to byte array + The keysize doesn't match the algorithm. + Failed to create symmetric algorithm with provided key and algorithm. + + + + + Gets the KeyWrap algorithm that is being used. + + + + + Gets or sets a user context for a . + + This is null by default. This can be used by runtimes or for extensibility scenarios. + + + + Gets the that is being used. + + + + + Disposes of internal components. + + true, if called from Dispose(), false, if invoked inside a finalizer. + + + + Returns the . + + + The cannot be converted to byte array + The keysize doesn't match the algorithm. + Failed to create symmetric algorithm with provided key and algorithm. + + + + Answers if an algorithm is supported + + the + the algorithm to use + true if the algorithm is supported; otherwise, false. + + + + Unwrap a key using Symmetric decryption. + + bytes to unwrap + Unwraped key + 'keyBytes' is null or length == 0. + 'keyBytes' is not a multiple of 8. + If has been called. + Failed to unwrap the wrappedKey. + + + + Wrap a key using Symmetric encryption. + + the key to be wrapped + The wrapped key result + 'keyBytes' is null or has length 0. + 'keyBytes' is not a multiple of 8. + If has been called. + Failed to wrap 'keyBytes'. + + + + Returns the absolute DateTime or the Seconds since Unix Epoch, where Epoch is UTC 1970-01-01T0:0:0Z. + + + + + DateTime as UTV for UnixEpoch + + + + + Per JWT spec: + Gets the number of seconds from 1970-01-01T0:0:0Z as measured in UTC until the desired date/time. + + The DateTime to convert to seconds. + if dateTimeUtc less than UnixEpoch, return 0 + the number of seconds since Unix Epoch. + + + + Creates a DateTime from epoch time. + + Number of seconds. + The DateTime in UTC. + + + + Thrown when JWE compression fails. + + + + + Initializes a new instance of + + + + + Initializes a new instance of + + + + + Initializes a new instance of + + + + + Thrown when JWE decompression fails. + + + + + Initializes a new instance of + + + + + Initializes a new instance of + + + + + Initializes a new instance of + + + + + Represents a security token exception when decryption failed. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class with a specified error message + and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The that is the cause of the current exception, or a null reference if no inner exception is specified. + + + + Represents a security token exception when encryption failed. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class with a specified error message + and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The that is the cause of the current exception, or a null reference if no inner exception is specified. + + + + This exception is thrown when a security token contained a key identifier but the key was not found by the runtime + when decrypting a token. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Addtional information to be included in the exception and displayed to user. + + + + Initializes a new instance of the class. + + Addtional information to be included in the exception and displayed to user. + A that represents the root cause of the exception. + + + + Represents a security token exception. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class with a specified error message + and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The that is the cause of the current exception, or a null reference if no inner exception is specified. + + + + Throw this exception when a received Security Token has expiration time in the past. + + + + + Gets or sets the Expires value that created the validation exception. + + + + + Initializes a new instance of + + + + + Initializes a new instance of + + + + + Initializes a new instance of + + + + + This exception is thrown when 'audience' of a token was not valid. + + + + + Gets or sets the InvalidAudience that created the validation exception. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Addtional information to be included in the exception and displayed to user. + + + + Initializes a new instance of the class. + + Addtional information to be included in the exception and displayed to user. + A that represents the root cause of the exception. + + + + This exception is thrown when 'issuer' of a token was not valid. + + + + + Gets or sets the InvalidIssuer that created the validation exception. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Addtional information to be included in the exception and displayed to user. + + + + Initializes a new instance of the class. + + Addtional information to be included in the exception and displayed to user. + A that represents the root cause of the exception. + + + + This exception is thrown when 'lifetime' of a token was not valid. + + + + + Gets or sets the NotBefore value that created the validation exception. + + + + + Gets or sets the Expires value that created the validation exception. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Addtional information to be included in the exception and displayed to user. + + + + Initializes a new instance of the class. + + Addtional information to be included in the exception and displayed to user. + A that represents the root cause of the exception. + + + + This exception is thrown when 'signature' of a token was not valid. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Addtional information to be included in the exception and displayed to user. + + + + Initializes a new instance of the class. + + Addtional information to be included in the exception and displayed to user. + A that represents the root cause of the exception. + + + + Throw this exception when a received Security Token has an invalid issuer signing key. + + + + + Gets or sets the SigningKey that was found invalid. + + + + + Initializes a new instance of + + + + + Initializes a new instance of + + + + + Initializes a new instance of + + + + + Represents a key wrap exception when encryption failed. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class with a specified error message + and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The that is the cause of the current exception, or a null reference if no inner exception is specified. + + + + This exception is thrown when a security is missing an ExpirationTime. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Addtional information to be included in the exception and displayed to user. + + + + Initializes a new instance of the class. + + Addtional information to be included in the exception and displayed to user. + A that represents the root cause of the exception. + + + + Throw this exception when a received Security token has an effective time + in the future. + + + + + Gets or sets the NotBefore value that created the validation exception. + + + + + Initializes a new instance of + + + + + Initializes a new instance of + + + + + Initializes a new instance of + + + + + This exception is thrown when an add to the TokenReplayCache fails. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Addtional information to be included in the exception and displayed to user. + + + + Initializes a new instance of the class. + + Addtional information to be included in the exception and displayed to user. + A that represents the root cause of the exception. + + + + Throw this exception when a received Security Token has been replayed. + + + + + Initializes a new instance of + + + + + Initializes a new instance of + + + + + Initializes a new instance of + + + + + This exception is thrown when a security token contained a key identifier but the key was not found by the runtime. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Addtional information to be included in the exception and displayed to user. + + + + Initializes a new instance of the class. + + Addtional information to be included in the exception and displayed to user. + A that represents the root cause of the exception. + + + + Represents a security token validation exception. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class with a specified error message + and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The that is the cause of the current exception, or a null reference if no inner exception is specified. + + + + Compression provider interface. + + + + + Gets the compression algorithm. + + + + + Called to determine if an algorithm is supported. + + the algorithm that defines the compression method. + true if supported + + + + Decompress. + + the value to decompress. + + + + Compress. + + the value to decompress. + + + + Provides extensibility for cryptographic operators. + If custom operators are needed for then can be set to + return these operators. will be before each creation. + + + + + Called to determine if a cryptographic operation is supported. + + the algorithm that defines the cryptographic operator. + the arguments required by the cryptographic operator. May be null. + true if supported + + + + returns a cryptographic operator that supports the algorithm. + + the algorithm that defines the cryptographic operator. + the arguments required by the cryptographic operator. May be null. + call when finished with the object. + + + + called to release the object returned from + + the object returned from . + + + + Defines a cache for crypto providers. + Current support is limited to only. + + + + + Returns the cache key to use when looking up an entry into the cache for a + + the to create the key for. + if signatureProvider is null. + the cache key to use for finding a . + + + + Returns the 'key' that will be used to find a crypto provider in this cache. + + the key that is used to by the crypto provider. + the algorithm that is used by the crypto provider. + the typeof the crypto provider obtained by calling object.GetType(). + if securityKey is null. + if algorithm is null or empty string. + if typeofProvider is null or empty string. + the cache key to use for finding a crypto provider. + + + + Trys to adds a to this cache. + + to cache. + if signatureProvider is null. + true if the was added, false if the cache already contained the + if the is added will be set to 'this'. + + + + Trys to find a to this cache. + + the key that is used to by the crypto provider. + the algorithm that is used by the crypto provider. + the typeof the crypto provider obtained by calling object.GetType(). + a bool to indicate if the will be used to sign. + the if found. + if securityKey is null. + if algorithm is null or empty string. + if typeofProvider is null or empty string. + true if a was found, false otherwise. + + + + Trys to remove a from this cache. + + to remove. + if signatureProvider is null. + true if the was removed, false if the was not found. + if the is removed will be set to null. + + + + ISecurityTokenValidator + + + + + Returns true if the token can be read, false otherwise. + + + + + Returns true if a token can be validated. + + + + + Gets and sets the maximum size in bytes, that a will be processed. + + + + + Validates a token passed as a string using + + + + + Interface that defines a simple cache for tacking replaying of security tokens. + + + + + Try to add a securityToken. + + the security token to add. + the time when security token expires. + true if the security token was successfully added. + + + + Try to find securityToken + + the security token to find. + true if the security token is found. + + + + Constants for JsonWebAlgorithms "kty" Key Type (sec 6.1) + http://tools.ietf.org/html/rfc7518#section-6.1 + + + + + Represents a JSON Web Key as defined in http://tools.ietf.org/html/rfc7517. + + + + + Magic numbers identifying ECDSA blob types + + + + + Returns a new instance of . + + A string that contains JSON Web Key parameters in JSON format. + + If 'json' is null or empty. + If 'json' fails to deserialize. + + + + Initializes an new instance of . + + + + + Initializes an new instance of from a json string. + + A string that contains JSON Web Key parameters in JSON format. + If 'json' is null or empty. + If 'json' fails to deserialize. + + + + When deserializing from JSON any properties that are not defined will be placed here. + + + + + Gets or sets the 'alg' (KeyType).. + + + + + Gets or sets the 'crv' (ECC - Curve).. + + + + + Gets or sets the 'd' (ECC - Private Key OR RSA - Private Exponent).. + + Value is formated as: Base64urlUInt + + + + Gets or sets the 'dp' (RSA - First Factor CRT Exponent).. + + Value is formated as: Base64urlUInt + + + + Gets or sets the 'dq' (RSA - Second Factor CRT Exponent).. + + Value is formated as: Base64urlUInt + + + + Gets or sets the 'e' (RSA - Exponent).. + + + + + Gets or sets the 'k' (Symmetric - Key Value).. + + Base64urlEncoding + + + + Gets the key id of this . + + + + + Gets the 'key_ops' (Key Operations).. + + + + + Gets or sets the 'kid' (Key ID).. + + + + + Gets or sets the 'kty' (Key Type).. + + + + + Gets or sets the 'n' (RSA - Modulus).. + + Value is formated as: Base64urlEncoding + + + + Gets or sets the 'oth' (RSA - Other Primes Info).. + + + + + Gets or sets the 'p' (RSA - First Prime Factor).. + + Value is formated as: Base64urlUInt + + + + Gets or sets the 'q' (RSA - Second Prime Factor).. + + Value is formated as: Base64urlUInt + + + + Gets or sets the 'qi' (RSA - First CRT Coefficient).. + + Value is formated as: Base64urlUInt + + + + Gets or sets the 'use' (Public Key Use).. + + + + + Gets or sets the 'x' (ECC - X Coordinate).. + + Value is formated as: Base64urlEncoding + + + + Gets the 'x5c' collection (X.509 Certificate Chain).. + + + + + Gets or sets the 'x5t' (X.509 Certificate SHA-1 thumbprint).. + + + + + Gets or sets the 'x5t#S256' (X.509 Certificate SHA-1 thumbprint).. + + + + + Gets or sets the 'x5u' (X.509 URL).. + + + + + Gets or sets the 'y' (ECC - Y Coordinate).. + + Value is formated as: Base64urlEncoding + + + + Gets the key size of . + + + + + Gets a bool indicating if a private key exists. + + true if it has a private key; otherwise, false. + + + + Gets a bool that determines if the 'key_ops' (Key Operations) property should be serialized. + This is used by Json.NET in order to conditionally serialize properties. + + true if 'key_ops' (Key Operations) is not empty; otherwise, false. + + + + Gets a bool that determines if the 'x5c' collection (X.509 Certificate Chain) property should be serialized. + This is used by Json.NET in order to conditionally serialize properties. + + true if 'x5c' collection (X.509 Certificate Chain) is not empty; otherwise, false. + + + + Returns the size of key in bytes + + Represents ecdsa curve -P256, P384, P521 + Size of the key in bytes + + + + Returns the size of key in bits. + + Represents ecdsa curve -P256, P384, P512 + Size of the key in bits. + + + + Returns the magic value representing the curve corresponding to the curve id. + + Represents ecdsa curve -P256, P384, P512 + Whether the provider will create signatures or not + Uint representing the magic number + + + + Converts a into a + Supports: , and . + + + + + Converts a into a + + a to convert. + a + if is null. + if is not a supported type. + Supports: , and . + + + + Converts a into a + + a to convert. + a + if is null. + + + + Converts a into a + + a to convert. + a + if is null. + + + + Converts a into a + + a to convert. + a + if is null. + + + + Constants for JsonWebKey Elliptical Curve Types + https://tools.ietf.org/html/rfc7518#section-6.2.1.1 + + + + + Names for Json Web Key Values + + + + + Contains a collection of that can be populated from a json string. + + provides support for http://tools.ietf.org/html/rfc7517. + + + + Returns a new instance of . + + a string that contains JSON Web Key parameters in JSON format. + + If 'json' is null or empty. + If 'json' fails to deserialize. + + + + Initializes an new instance of . + + + + + Initializes an new instance of from a json string. + + a json string containing values. + If 'json' is null or empty. + If 'json' fails to deserialize. + + + + Initializes an new instance of from a json string. + + a json string containing values. + jsonSerializerSettings + If 'json' is null or empty. + If 'json' fails to deserialize. + + + + When deserializing from JSON any properties that are not defined will be placed here. + + + + + Gets the . + + + + + Returns the JsonWebKeys as a . + + + + + Names for Json Web Key Set Values + + + + + Constants for JsonWebKeyUse (sec 4.2) + http://tools.ietf.org/html/rfc7517#section-4 + + + + + Log messages and codes + + + + + The purpose of this class is to ensure that we obtain an RsaCryptoServiceProvider that supports SHA-256 signatures. + If the original RsaCryptoServiceProvider doesn't support SHA-256, we create a new one using the same KeyContainer. + + + + + Gets the SignatureAlgorithm + + + + + Gets the KeyExchangeAlgorithm + + + + + Initializes an new instance of . + + + if is null. + + + + Decrypts data with the System.Security.Cryptography.RSA algorithm. + + The data to be decrypted. + true to perform direct System.Security.Cryptography.RSA decryption using OAEP padding + (only available on a computer running Microsoft Windows XP or later) otherwise, false to use PKCS#1 v1.5 padding. + decrypted bytes. + if is null or has Length == 0. + + + + Decrypts the input. + + the bytes to decrypt. + decrypted bytes + if is null or Length == 0. + + + + Encrypts data with the System.Security.Cryptography.RSA algorithm. + + The data to be encrypted. + true to perform direct System.Security.Cryptography.RSA encryption using OAEP padding (only available on a computer running Microsoft Windows XP or later); + otherwise, false to use PKCS#1 v1.5 padding. + encrypted bytes. + if is null or has Length == 0. + + + + Encrypts the input. + + the bytes to encrypt. + encrypted bytes. + if is null or Length == 0. + + + + Computes the hash value of the specified byte array using the specified hash algorithm, and signs the resulting hash value. + + The input byte array for which to compute the hash. + The hash algorithm to use to create the hash value. + The Signature for the specified data. + if is null or Length == 0. + if is null. + + + + Verifies that a digital signature is valid by determining the hash value in the signature using the provided public key and comparing it to the hash value of the provided data. + + The input byte array. + The hash algorithm to use to create the hash value. + The signature byte array to be verified. + true if the signature is valid; otherwise, false. + if is null or Length == 0. + if is null. + if is null or Length == 0. + + + + Exports rsa parameters as + + flag to control is private parameters are included. + + + + + Imports rsa parameters as + + to import. + + + + Calls to release managed resources. + + true, if called from Dispose(), false, if invoked inside a finalizer. + + + + Represents a Rsa security key. + + + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class. + + + + + + Gets a bool indicating if a private key exists. + + true if it has a private key; otherwise, false. + + + + Gets an enum indicating if a private key exists. + + 'Exists' if private key exists for sure; 'DoesNotExist' if private key doesn't exist for sure; 'Unknown' if we cannot determine. + + + + Gets RSA key size. + + + + + used to initialize the key. + + + + + instance used to initialize the key. + + + + + Constants for Security Algorithm. + + + + + Base class for Security Key. + + + + + This must be overridden to get the size of this . + + + + + Gets the key id of this . + + + + + Gets or sets . + + + + + Contains information about the keys inside the tokens. + + + + + Base class for security token. + + + + + This must be overridden to get the Id of this . + + + + + This must be overridden to get the issuer of this . + + + + + This must be overridden to get the . + + + + + This must be overridden to get or set the that signed this instance. + + .ValidateToken(...) can this value when a is used to successfully validate a signature. + + + + This must be overridden to get the time when this was Valid. + + + + + This must be overridden to get the time when this is no longer Valid. + + + + + Contains some information which used to create a security token. + + + + + Gets or sets the value of the 'audience' claim. + + + + + Gets or sets the used to create a encrypted security token. + + + + + Gets or sets the value of the 'expiration' claim. + + + + + Gets or sets the issuer of this . + + + + + Gets or sets the time the security token was issued. + + + + + Gets or sets the notbefore time for the security token. + + + + + Gets or sets the used to create a security token. + + + + + Gets or sets the . + + + + + Defines the interface for a Security Token Handler. + + + + + Creates an instance of + + + + + Returns . + + + true if attached; otherwise, false. + + + + Returns . + + + + + + Gets a value indicating whether this handler supports validation of tokens + handled by this instance. + v + 'True' if the instance is capable of SecurityToken + validation. + + + + Gets a value indicating whether the class provides serialization functionality to serialize token handled + by this instance. + + true if the WriteToken method can serialize this token. + + + + This must be overridden to get the System.Type of the SecurityToken this instance handles. + + + + + Indicates whether the current token string can be read as a token + of the type handled by this instance. + + The token string thats needs to be read. + 'True' if the ReadToken method can parse the token string. + + + + Deserializes from string a token of the type handled by this instance. + + The string to be deserialized. + SecurityToken instance which represents the serialized token. + + + + Gets security token. + + . + SecurityToken instance which represents the serialized token. + + + + Serializes to string a token of the type handled by this instance. + + A token of type TokenType. + The serialized token. + + + + This must be overridden to serialize to XML a token of the type handled by this instance. + + The XML writer. + A token of type . + + + + This must be overridden to deserialize token with the provided . + + . + the current . + SecurityToken instance which represents the serialized token. + + + + This must be overridden to validate a token passed as a string using + + A token of type . + the current . + The token of type that was validated. + + + + Provides signature services, signing and verifying. + + + + + Initializes a new instance of the class used to create and verify signatures. + + The that will be used for signature operations. + The signature algorithm to apply. + is null. + is null or empty. + + + + Gets the signature algorithm. + + + + + Gets or sets a user context for a . + + This is null by default. This is for use by the application and not used by this SDK. + + + + Gets or sets the that is associated with this + + + + + Calls and + + + + + Can be over written in descendants to dispose of internal components. + + true, if called from Dispose(), false, if invoked inside a finalizer + + + + Gets the . + + + + + This must be overridden to produce a signature over the 'input'. + + bytes to sign. + signed bytes + + + Verifies that the over using the + and specified by this + are consistent. + the bytes that were signed. + signature to compare against. + true if the computed signature matches the signature parameter, false otherwise. + + + + Gets or sets a bool indicating if this is expected to create signatures. + + + + + Defines the , algorithm and digest for digital signatures. + + + + + Initializes a new instance of the class. + + that will be used for signing. + Algorithm will be set to . + the 'digest method' if needed may be implied from the algorithm. For example implies Sha256. + if 'key' is null. + if 'algorithm' is null or empty. + + + + Initializes a new instance of the class. + + that will be used for signing. + The signature algorithm to apply. + the 'digest method' if needed may be implied from the algorithm. For example implies Sha256. + if 'certificate' is null. + if 'algorithm' is null or empty. + + + + Initializes a new instance of the class. + + . + The signature algorithm to apply. + the 'digest method' if needed may be implied from the algorithm. For example implies Sha256. + if 'key' is null. + if 'algorithm' is null or empty. + + + + Initializes a new instance of the class. + + . + The signature algorithm to apply. + The digest algorithm to apply. + if 'key' is null. + if 'algorithm' is null or empty. + if 'digest' is null or empty. + + + + Gets the signature algorithm. + + if 'value' is null or empty. + + + + Gets the digest algorithm. + + + + + Users can override the default with this property. This factory will be used for creating signature providers. + + This will have precedence over + + + + Gets the used for signature creation or validation. + + + + + Gets the key id associated with . + + + + + Defines the default set of algorithms this library supports + + + + + Checks if an 'algorithm, key' pair is supported. + + the algorithm to check. + the . + true if 'algorithm, key' pair is supported. + + + + Represents a symmetric security key. + + + + + Returns a new instance of instance. + + The byte array of the key. + + + + Gets the key size. + + + + + Gets the byte array of the key. + + + + + Provides signing and verifying operations using a and specifying an algorithm. + + + + + This is the minimum .KeySize when creating and verifying signatures. + + + + + Initializes a new instance of the class that uses an to create and / or verify signatures over a array of bytes. + + The that will be used for signature operations. + The signature algorithm to use. + 'key' is null. + 'algorithm' is null or empty. + If and algorithm pair are not supported. + '.KeySize' is smaller than . + + + + Initializes a new instance of the class that uses an to create and / or verify signatures over a array of bytes. + + The that will be used for signature operations. + The signature algorithm to use. + indicates if this will be used to create signatures. + 'key' is null. + 'algorithm' is null or empty. + If and algorithm pair are not supported. + '.KeySize' is smaller than . + + + + Gets or sets the minimum .KeySize"/>. + + 'value' is smaller than . + + + + Called to obtain the byte[] needed to create a + + that will be used to obtain the byte[]. + [] that is used to populated the KeyedHashAlgorithm. + if key is null. + if a byte[] can not be obtained from SecurityKey. + and are supported. + For a .Key is returned + For a Base64UrlEncoder.DecodeBytes is called with if == JsonWebAlgorithmsKeyTypes.Octet + + + + + Returns the . + + The hash algorithm to use to create the hash value. + The byte array of the key. + + + + + Gets the for this . + + + + + Produces a signature over the 'input' using the and 'algorithm' passed to . + + The bytes to sign. + Signed bytes + 'input' is null. + 'input.Length' == 0. + has been called. + is null. This can occur if a derived type deletes it or does not create it. + Sign is thread safe. + + + + Verifies that a signature created over the 'input' matches the signature. Using and 'algorithm' passed to . + + The bytes to verify. + signature to compare against. + true if computed signature matches the signature parameter, false otherwise. + 'input' is null. + 'signature' is null. + 'input.Length' == 0. + 'signature.Length' == 0. + has been called. + If the internal is null. This can occur if a derived type deletes it or does not create it. + Verify is thread safe. + + + + Verifies that a signature created over the 'input' matches the signature. Using and 'algorithm' passed to . + + The bytes to verify. + signature to compare against. + number of bytes of signature to use. + true if computed signature matches the signature parameter, false otherwise. + 'input' is null. + 'signature' is null. + 'input.Length' == 0. + 'signature.Length' == 0. + 'length < 1' + has been called. + If the internal is null. This can occur if a derived type deletes it or does not create it. + + + + Disposes of internal components. + + true, if called from Dispose(), false, if invoked inside a finalizer. + + + + Defines properties shared across all security token handlers. + + + + + Default lifetime of tokens created. When creating tokens, if 'expires' and 'notbefore' are both null, + then a default will be set to: expires = DateTime.UtcNow, notbefore = DateTime.UtcNow + TimeSpan.FromMinutes(TokenLifetimeInMinutes). + + + + + Gets and sets the maximum token size in bytes that will be processed. + + 'value' less than 1. + + + + Gets or sets a bool that controls if token creation will set default 'exp', 'nbf' and 'iat' if not specified. + + See: for configuration. + + + + Gets or sets the token lifetime in minutes. + + Used during token creation to set the default expiration ('exp'). + 'value' less than 1. + + + + Definition for AudienceValidator. + + The audiences found in the . + The being validated. + required for validation. + true if the audience is considered valid. + + + + Definition for IssuerSigningKeyResolver. + + The representation of the token that is being validated. + The that is being validated. It may be null. + A key identifier. It may be null. + required for validation. + A to use when validating a signature. + + + + Definition for IssuerSigningKeyValidator. + + The that signed the . + The being validated. + required for validation. + + + + Definition for IssuerValidator. + + The issuer to validate. + The that is being validated. + required for validation. + The issuer to use when creating the "Claim"(s) in a "ClaimsIdentity". + The delegate should return a non null string that represents the 'issuer'. If null a default value will be used. + + + + Definition for LifetimeValidator. + + The 'notBefore' time found in the . + The 'expiration' time found in the . + The being validated. + required for validation. + + + + Definition for TokenReplayValidator. + + The 'expiration' time found in the . + The being validated. + required for validation. + + + + + Definition for SignatureValidator. + + A securityToken with a signature. + required for validation. + + + + Definition for TokenReader. + + A securityToken with a signature. + required for validation. + + + + Definition for TokenDecryptionKeyResolver. + + The representation of the token to be decrypted. + The to be decrypted. The runtime by default passes null. + A key identifier. It may be null. + required for validation. + A to use when decrypting the token. + + + + Contains a set of parameters that are used by a when validating a . + + + + + This is the fallback authenticationtype that a will use if nothing is set. + + + + + Default for the clock skew. + + 300 seconds (5 minutes). + + + + Default for the maximm token size. + + 2 MB (mega bytes). + + + + Copy constructor for . + + + + + Initializes a new instance of the class. + + + + + Gets or sets . + + + + + Gets or sets a delegate that will be used to validate the audience. + + + If set, this delegate will be called to validate the 'audience' instead of normal processing. + If is false, this delegate will not be called. + + + + + Gets or sets a delegate that will be used to read the token. + + + If set, this delegate will be called to read the token instead of normal processing. + + + + + Gets or sets the AuthenticationType when creating a . + + If 'value' is null or whitespace. + + + + Gets or sets the clock skew to apply when validating a time. + + If 'value' is less than 0. + + + + Returns a new instance of with values copied from this object. + + A new object copied from this object + This is a shallow Clone. + + + + Creates a using: + + 'NameClaimType': If NameClaimTypeRetriever is set, call delegate, else call NameClaimType. If the result is a null or empty string, use . + 'RoleClaimType': If RoleClaimTypeRetriever is set, call delegate, else call RoleClaimType. If the result is a null or empty string, use . + + A with Authentication, NameClaimType and RoleClaimType set. + + + + Users can override the default with this property. This factory will be used for creating signature providers. + + + + + Gets or sets the that is to be used for decryption. + + + + + Gets or sets a delegate that will be called to retreive a used for decryption. + + + This will be used to decrypt the token. This can be helpful when the does not contain a key identifier. + + + + + Gets or sets a delegate for validating the that signed the token. + + + If set, this delegate will be called to validate the that signed the token, instead of normal processing. + + + + + Gets or sets the that is to be used for signature validation. + + + + + Gets or sets a delegate that will be called to retrieve a used for signature validation. + + + This will be used to check the signature. This can be helpful when the does not contain a key identifier. + + + + + Gets or sets an used for signature validation. + + + + + Gets or sets a delegate that will be used to validate the issuer of the token. + + + If set, this delegate will be called to validate the 'issuer' of the token, instead of normal processing. + If is false, this delegate will not be called. + + + + + Gets or sets a delegate that will be used to validate the lifetime of the token + + + If set, this delegate will be called to validate the lifetime of the token, instead of normal processing. + If is false, this delegate will not be called. + + + + + Gets or sets a delegate that will be used to validate the token replay of the token + + + If set, this delegate will be called to validate the token replay of the token, instead of normal processing. + If is false, this delegate will not be called. + + + + + Gets or sets a that defines the . + + + Controls the value returns. It will return the first where the equals . + + + + + Gets or sets the that defines the . + + + Controls the results of . + Each where == will be checked for a match against the 'string' passed to . + + + + + Gets or sets a delegate that will be called to obtain the NameClaimType to use when creating a ClaimsIdentity + after validating a token. + + + + + Gets or sets the that contains a collection of custom key/value pairs. This allows addition of parameters that could be used in custom token validation scenarios. + + + + + Gets or sets a value indicating whether tokens must have an 'expiration' value. + + + + + Gets or sets a value indicating whether a can be considered valid if not signed. + + + + + Gets or sets a delegate that will be called to obtain the RoleClaimType to use when creating a ClaimsIdentity + after validating a token. + + + + + Gets or sets a boolean to control if the original token should be saved after the security token is validated. + + The runtime will consult this value and save the original token that was validated. + + + + Gets or sets a delegate that will be used to validate the signature of the token. + + + If set, this delegate will be called to signature of the token, instead of normal processing. + + + + + Gets or sets the that is to be used for decrypting inbound tokens. + + + + + Gets or set the that store tokens that can be checked to help detect token replay. + + If set, then tokens must have an expiration time or the runtime will fault. + + + + Gets or sets a value indicating if an actor token is detected, whether it should be validated. + + + + + Gets or sets a boolean to control if the audience will be validated during token validation. + + Validation of the audience, mitigates forwarding attacks. For example, a site that receives a token, could not replay it to another side. + A forwarded token would contain the audience of the original site. + + + + Gets or sets a boolean to control if the issuer will be validated during token validation. + + + Validation of the issuer mitigates forwarding attacks that can occur when an + IdentityProvider represents multiple tenants and signs tokens with the same keys. + It is possible that a token issued for the same audience could be from a different tenant. For example an application could accept users from + contoso.onmicrosoft.com but not fabrikam.onmicrosoft.com, both valid tenants. A application that accepts tokens from fabrikam could forward them + to the application that accepts tokens for contoso. + + + + + Gets or sets a boolean to control if the lifetime will be validated during token validation. + + + + + Gets or sets a boolean that controls if validation of the that signed the securityToken is called. + + It is possible for tokens to contain the public key needed to check the signature. For example, X509Data can be hydrated into an X509Certificate, + which can be used to validate the signature. In these cases it is important to validate the SigningKey that was used to validate the signature. + + + + Gets or sets a boolean to control if the token replay will be validated during token validation. + + + + + Gets or sets a string that represents a valid audience that will be used to check against the token's audience. + + + + + Gets or sets the that contains valid audiences that will be used to check against the token's audience. + + + + + Gets or sets a that represents a valid issuer that will be used to check against the token's issuer. + + + + + Gets or sets the that contains valid issuers that will be used to check against the token's issuer. + + + + + Generates unique IDs. + + + + + Creates a unique ID suitable for use in an xml:id field. The value is + not hard to guess but is unique. + + The unique ID. + + + + Creates a unique ID similar to that created by CreateNonRandomId, + but instead of an underscore, the supplied prefix is used. + + The prefix to use. + The unique ID, with the given prefix. + + + + Creates a unique, random ID suitable for use in an xml:id field. The + value is hard to guess and unique. + + The unique ID. + + + + Creates a unique, random ID similar to that created by CreateRandomId, + but instead of an underscore, the supplied prefix is used. + + The prefix to use. + The random URI. + + + + Creates a unique, random ID suitable for use as a URI. The value is + hard to guess and unique. The URI is in the urn:uuid: namespace. + + The random URI. + + + + Contains some utility methods. + + + + + A string with "empty" value. + + + + + A string with "null" value. + + + + + Creates a copy of the byte array. + + The resource array. + A copy of the byte array. + + + + Serializes the list of strings into string as follows: + 'str1','str2','str3' ... + + + The strings used to build a comma delimited string. + + + The single . + + + + + Returns whether the input string is https. + + The input string. + true if the input string is https; otherwise, false. + + + + Returns whether the input uri is https. + + . + true if the input uri is https; otherwise, false. + + + + Compares two byte arrays for equality. Hash size is fixed normally it is 32 bytes. + The attempt here is to take the same time if an attacker shortens the signature OR changes some of the signed contents. + + + One set of bytes to compare. + + + The other set of bytes to compare with. + + + true if the bytes are equal, false otherwise. + + + + + Compares two byte arrays for equality. Hash size is fixed normally it is 32 bytes. + The attempt here is to take the same time if an attacker shortens the signature OR changes some of the signed contents. + + + One set of bytes to compare. + + + The other set of bytes to compare with. + + length of array to check + + true if the bytes are equal, false otherwise. + + + + + AudienceValidator + + + + + Determines if the audiences found in a are valid. + + The audiences found in the . + The being validated. + required for validation. + If 'vaidationParameters' is null. + If 'audiences' is null and is true. + If is null or whitespace and is null. + If none of the 'audiences' matched either or one of . + An EXACT match is required. + + + + Determines if an issuer found in a is valid. + + The issuer to validate + The that is being validated. + required for validation. + The issuer to use when creating the "Claim"(s) in a "ClaimsIdentity". + If 'vaidationParameters' is null. + If 'issuer' is null or whitespace and is true. + If is null or whitespace and is null. + If 'issuer' failed to matched either or one of . + An EXACT match is required. + + + + Validates the that signed a . + + The that signed the . + The being validated. + required for validation. + if 'securityKey' is null and ValidateIssuerSigningKey is true. + if 'securityToken' is null and ValidateIssuerSigningKey is true. + if 'vaidationParameters' is null. + + + + Validates the lifetime of a . + + The 'notBefore' time found in the . + The 'expiration' time found in the . + The being validated. + required for validation. + If 'vaidationParameters' is null. + If 'expires.HasValue' is false and is true. + If 'notBefore' is > 'expires'. + If 'notBefore' is > DateTime.UtcNow. + If 'expires' is < DateTime.UtcNow. + All time comparisons apply . + + + + Validates if a token has been replayed. + + When does the security token expire. + The being validated. + required for validation. + If 'securityToken' is null or whitespace. + If 'validationParameters' is null or whitespace. + If is not null and expirationTime.HasValue is false. When a TokenReplayCache is set, tokens require an expiration time. + If the 'securityToken' is found in the cache. + If the 'securityToken' could not be added to the . + + + + Validates if a token has been replayed. + + The being validated. + When does the security token expire. + required for validation. + If 'securityToken' is null or whitespace. + If 'validationParameters' is null or whitespace. + If is not null and expirationTime.HasValue is false. When a TokenReplayCache is set, tokens require an expiration time. + If the 'securityToken' is found in the cache. + If the 'securityToken' could not be added to the . + + + + An designed to construct based on a x509 certificate. + + + + + Designed to construct based on a x509 certificate. + + A + + will be used as the key wrap algorithm + will be used as the data encryption algorithm + + if 'certificate' is null. + + + + Designed to construct based on the x509 certificate, a key wrap algorithm, and data encryption algorithm. + + A + A key wrap algorithm + Data encryption algorithm + if 'certificate' is null. + if 'keyWrapAlgorithm' is null or empty. + if 'dataEncryptionAlgorithm' is null or empty. + + + + Gets the used by this instance. + + + + + Security key that allows access to cert + + + + + Instantiates a using a + + The cert to use. + + + + Gets the key size. + + + + + Gets the X5t of this . + + + + + Returns the private key from the . + + + + + Gets the public key from the . + + + + + Gets a bool indicating if a private key exists. + + true if it has a private key; otherwise, false. + + + + Gets an enum indicating if a private key exists. + + 'Exists' if private key exists for sure; 'DoesNotExist' if private key doesn't exist for sure; 'Unknown' if we cannot determine. + + + + Gets the . + + + + + Returns a bool indicating if this key is equivalent to another key. + + true if the keys are equal; otherwise, false. + + + + Returns an int hash code. + + An int hash code + + + + Defines the , algorithm and digest for digital signatures. + + + + + Initializes a new instance of the class. + + that will be used for signing. + Algorithm will be set to . + the 'digest method' if needed may be implied from the algorithm. For example implies Sha256. + if 'certificate' is null. + + + + Initializes a new instance of the class. + + A that will be used for signing. + The signature algorithm to apply. + the 'digest method' if needed may be implied from the algorithm. For example implies Sha256. + if 'certificate' is null. + if 'algorithm' is null or empty. + + + + Gets the used by this instance. + + + + diff --git a/Bin/Microsoft.Owin.xml b/Bin/Microsoft.Owin.xml new file mode 100644 index 000000000..4380dc571 --- /dev/null +++ b/Bin/Microsoft.Owin.xml @@ -0,0 +1,3316 @@ + + + + Microsoft.Owin + + + + + Extension methods for . + + + + + Inserts a middleware into the OWIN pipeline. + + The middleware type + + Any additional arguments for the middleware constructor + + + + + Inserts into the OWIN pipeline a middleware which does not have a next middleware reference. + + + An app that handles all requests + + + + Inserts a middleware into the OWIN pipeline. + + + An app that handles the request or calls the given next Func + + + + + An ordered list of known Asp.Net integrated pipeline stages. More details on the ASP.NET integrated pipeline can be found at http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx + + + + + Corresponds to the AuthenticateRequest stage of the ASP.NET integrated pipeline. + + + + + Corresponds to the PostAuthenticateRequest stage of the ASP.NET integrated pipeline. + + + + + Corresponds to the AuthorizeRequest stage of the ASP.NET integrated pipeline. + + + + + Corresponds to the PostAuthorizeRequest stage of the ASP.NET integrated pipeline. + + + + + Corresponds to the ResolveRequestCache stage of the ASP.NET integrated pipeline. + + + + + Corresponds to the PostResolveRequestCache stage of the ASP.NET integrated pipeline. + + + + + Corresponds to the MapRequestHandler stage of the ASP.NET integrated pipeline. + + + + + Corresponds to the PostMapRequestHandler stage of the ASP.NET integrated pipeline. + + + + + Corresponds to the AcquireRequestState stage of the ASP.NET integrated pipeline. + + + + + Corresponds to the PostAcquireRequestState stage of the ASP.NET integrated pipeline. + + + + + Corresponds to the PreRequestHandlerExecute stage of the ASP.NET integrated pipeline. + + + + + Extension methods for the MapMiddleware + + + + + If the request path starts with the given pathMatch, execute the app configured via configuration parameter instead of + continuing to the next component in the pipeline. + + + The path to match + The branch to take for positive path matches + + + + + If the request path starts with the given pathMatch, execute the app configured via configuration parameter instead of + continuing to the next component in the pipeline. + + + The path to match + The branch to take for positive path matches + + + + + Extension methods for the MapWhenMiddleware + + + + + Branches the request pipeline based on the result of the given predicate. + + + Invoked with the request environment to determine if the branch should be taken + Configures a branch to take + + + + + Branches the request pipeline based on the async result of the given predicate. + + + Invoked asynchronously with the request environment to determine if the branch should be taken + Configures a branch to take + + + + + Represents a middleware for executing in-line function middleware. + + + + + Initializes a new instance of the class. + + The pointer to next middleware. + A function that handles all requests. + + + + Initializes a new instance of the class. + + The pointer to next middleware. + A function that handles the request or calls the given next function. + + + + Invokes the handler for processing the request. + + The OWIN context. + The object that represents the request operation. + + + + Extension methods used to indicate at which stage in the integrated pipeline prior middleware should run. + + + + + Call after other middleware to specify when they should run in the integrated pipeline. + + The IAppBuilder. + The name of the integrated pipeline in which to run. + The original IAppBuilder for chaining. + + + + Call after other middleware to specify when they should run in the integrated pipeline. + + The IAppBuilder. + The stage of the integrated pipeline in which to run. + The original IAppBuilder for chaining. + + + + Contains the parsed form values. + + + + + Initializes a new instance of the class. + + The store for the form. + + + + Represents a wrapper for owin.RequestHeaders and owin.ResponseHeaders. + + + + + Initializes a new instance of the class. + + The underlying data store. + + + + Gets an that contains the keys in the ;. + + An that contains the keys in the . + + + + + + + + + Gets the number of elements contained in the ;. + + The number of elements contained in the . + + + + Gets a value that indicates whether the is in read-only mode. + + true if the is in read-only mode; otherwise, false. + + + + Get or sets the associated value from the collection as a single string. + + The header name. + the associated value from the collection as a single string or null if the key is not present. + + + + Throws KeyNotFoundException if the key is not present. + + The header name. + + + + + Returns an enumerator that iterates through a collection. + + An object that can be used to iterate through the collection. + + + + Returns an enumerator that iterates through a collection. + + An object that can be used to iterate through the collection. + + + + Get the associated value from the collection as a single string. + + The header name. + the associated value from the collection as a single string or null if the key is not present. + + + + Get the associated values from the collection without modification. + + The header name. + the associated value from the collection without modification, or null if the key is not present. + + + + Get the associated values from the collection separated into individual values. + Quoted values will not be split, and the quotes will be removed. + + The header name. + the associated values from the collection separated into individual values, or null if the key is not present. + + + + Add a new value. Appends to the header if already present + + The header name. + The header value. + + + + Add new values. Each item remains a separate array entry. + + The header name. + The header values. + + + + Quotes any values containing comas, and then coma joins all of the values with any existing values. + + The header name. + The header values. + + + + Sets a specific header value. + + The header name. + The header value. + + + + Sets the specified header values without modification. + + The header name. + The header values. + + + + Quotes any values containing comas, and then coma joins all of the values. + + The header name. + The header values. + + + + Adds the given header and values to the collection. + + The header name. + The header values. + + + + Determines whether the contains a specific key. + + The key. + true if the contains a specific key; otherwise, false. + + + + Removes the given header from the collection. + + The header name. + true if the specified object was removed from the collection; otherwise, false. + + + + Retrieves a value from the dictionary. + + The header name. + The value. + true if the contains the key; otherwise, false. + + + + Adds a new list of items to the collection. + + The item to add. + + + + Clears the entire list of objects. + + + + + Returns a value indicating whether the specified object occurs within this collection. + + The item. + true if the specified object occurs within this collection; otherwise, false. + + + + Copies the elements to a one-dimensional Array instance at the specified index. + + The one-dimensional Array that is the destination of the specified objects copied from the . + The zero-based index in at which copying begins. + + + + Removes the given item from the the collection. + + The item. + true if the specified object was removed from the collection; otherwise, false. + + + + Represents the host portion of a Uri can be used to construct Uri's properly formatted and encoded for use in + HTTP headers. + + + + + Creates a new HostString without modification. The value should be Unicode rather than punycode, and may have a port. + IPv4 and IPv6 addresses are also allowed, and also may have ports. + + + + + + Returns the original value from the constructor. + + + + + Returns the value as normalized by ToUriComponent(). + + + + + + Returns the value properly formatted and encoded for use in a URI in a HTTP header. + Any Unicode is converted to punycode. IPv6 addresses will have brackets added if they are missing. + + + + + + Creates a new HostString from the given uri component. + Any punycode will be converted to Unicode. + + + + + + + Creates a new HostString from the host and port of the give Uri instance. + Punycode will be converted to Unicode. + + + + + + + Compares the equality of the Value property, ignoring case. + + + + + + + Compares against the given object only if it is a HostString. + + + + + + + Gets a hash code for the value. + + + + + + Compares the two instances for equality. + + + + + + + + Compares the two instances for inequality. + + + + + + + + Contains the parsed form values. + + + + + Represents a wrapper for owin.RequestHeaders and owin.ResponseHeaders. + + + + + Get or sets the associated value from the collection as a single string. + + The header name. + the associated value from the collection as a single string or null if the key is not present. + + + + Get the associated values from the collection separated into individual values. + Quoted values will not be split, and the quotes will be removed. + + The header name. + the associated values from the collection separated into individual values, or null if the key is not present. + + + + Add a new value. Appends to the header if already present + + The header name. + The header value. + + + + Add new values. Each item remains a separate array entry. + + The header name. + The header values. + + + + Quotes any values containing comas, and then coma joins all of the values with any existing values. + + The header name. + The header values. + + + + Sets a specific header value. + + The header name. + The header value. + + + + Sets the specified header values without modification. + + The header name. + The header values. + + + + Quotes any values containing comas, and then coma joins all of the values. + + The header name. + The header values. + + + + An implementation of ICookieManager that writes directly to IOwinContext.Response.Cookies. + + + + + Read a cookie with the given name from the request. + + + + + + + + Appends a new response cookie to the Set-Cookie header. + + + + + + + + + Deletes the cookie with the given key by appending an expired cookie. + + + + + + + + This handles cookies that are limited by per cookie length. It breaks down long cookies for responses, and reassembles them + from requests. + + + + + Creates a new instance of ChunkingCookieManager. + + + + + The maximum size of cookie to send back to the client. If a cookie exceeds this size it will be broken down into multiple + cookies. Set this value to null to disable this behavior. The default is 4090 characters, which is supported by all + common browsers. + + Note that browsers may also have limits on the total size of all cookies per domain, and on the number of cookies per domain. + + + + + Throw if not all chunks of a cookie are available on a request for re-assembly. + + + + + Get the reassembled cookie. Non chunked cookies are returned normally. + Cookies with missing chunks just have their "chunks:XX" header returned. + + + + The reassembled cookie, if any, or null. + + + + Appends a new response cookie to the Set-Cookie header. If the cookie is larger than the given size limit + then it will be broken down into multiple cookies as follows: + Set-Cookie: CookieName=chunks:3; path=/ + Set-Cookie: CookieNameC1=Segment1; path=/ + Set-Cookie: CookieNameC2=Segment2; path=/ + Set-Cookie: CookieNameC3=Segment3; path=/ + + + + + + + + + Deletes the cookie with the given key by setting an expired state. If a matching chunked cookie exists on + the request, delete each chunk. + + + + + + + + An abstraction for reading request cookies and writing response cookies. + + + + + Read a cookie with the given name from the request. + + + + + + + + Append a cookie to the response. + + + + + + + + + Append a delete cookie to the response. + + + + + + + + Abstracts the system clock to facilitate testing. + + + + + Retrieves the current system time in UTC. + + + + + Provides access to the normal system clock. + + + + + Retrieves the current system time in UTC. + + + + + Response generation utilities. + + + + + Append the given query to the uri. + + The base uri. + The query string to append, if any. + The combine result. + + + + Append the given query key and value to the uri. + + The base uri. + The name of the query key. + The query value. + The combine result. + + + + Append the given query keys and values to the uri. + + The base uri. + A collection of name value query pairs to append. + The combine result. + + + + Converts between an OwinMiddlware and an . + + + + + + + + + + + + + + + + + + Transitions between and OwinMiddleware. + + + + + + + + + + + + + OWIN environment dictionary which stores state information about the request, response and relevant server state. + + + + + Adds adapters between and OwinMiddleware. + + + + + Adds adapters between and OwinMiddleware. + + + + + + This wraps OWIN environment dictionary and provides strongly typed accessors. + + + + + Gets a wrapper exposing request specific properties. + + A wrapper exposing request specific properties. + + + + Gets a wrapper exposing response specific properties. + + A wrapper exposing response specific properties. + + + + Gets the Authentication middleware functionality available on the current request. + + The authentication middleware functionality available on the current request. + + + + Gets the OWIN environment. + + The OWIN environment. + + + + Gets or sets the host.TraceOutput environment value. + + The host.TraceOutput TextWriter. + + + + Gets a value from the OWIN environment, or returns default(T) if not present. + + The type of the value. + The key of the value to get. + The value with the specified key or the default(T) if not present. + + + + Sets the given key and value in the OWIN environment. + + The type of the value. + The key of the value to set. + The value to set. + This instance. + + + + This wraps OWIN environment dictionary and provides strongly typed accessors. + + + + + Gets the OWIN environment. + + The OWIN environment. + + + + Gets the request context. + + The request context. + + + + Gets or set the HTTP method. + + The HTTP method. + + + + Gets or set the HTTP request scheme from owin.RequestScheme. + + The HTTP request scheme from owin.RequestScheme. + + + + Returns true if the owin.RequestScheme is https. + + true if this request is using https; otherwise, false. + + + + Gets or set the Host header. May include the port. + + The Host header. + + + + Gets or set the owin.RequestPathBase. + + The owin.RequestPathBase. + + + + Gets or set the request path from owin.RequestPath. + + The request path from owin.RequestPath. + + + + Gets or set the query string from owin.RequestQueryString. + + The query string from owin.RequestQueryString. + + + + Gets the query value collection parsed from owin.RequestQueryString. + + The query value collection parsed from owin.RequestQueryString. + + + + Gets the uniform resource identifier (URI) associated with the request. + + The uniform resource identifier (URI) associated with the request. + + + + Gets or set the owin.RequestProtocol. + + The owin.RequestProtocol. + + + + Gets the request headers. + + The request headers. + + + + Gets the collection of Cookies for this request. + + The collection of Cookies for this request. + + + + Gets or sets the Content-Type header. + + The Content-Type header. + + + + Gets or sets the Cache-Control header. + + The Cache-Control header. + + + + Gets or sets the Media-Type header. + + The Media-Type header. + + + + Gets or set the Accept header. + + The Accept header. + + + + Gets or set the owin.RequestBody Stream. + + The owin.RequestBody Stream. + + + + Gets or sets the cancellation token for the request. + + The cancellation token for the request. + + + + Gets or set the server.LocalIpAddress. + + The server.LocalIpAddress. + + + + Gets or set the server.LocalPort. + + The server.LocalPort. + + + + Gets or set the server.RemoteIpAddress. + + The server.RemoteIpAddress. + + + + Gets or set the server.RemotePort. + + The server.RemotePort. + + + + Gets or set the server.User. + + The server.User. + + + + Asynchronously reads and parses the request body as a form. + + The parsed form data. + + + + Gets a value from the OWIN environment, or returns default(T) if not present. + + The type of the value. + The key of the value to get. + The value with the specified key or the default(T) if not present. + + + + Sets the given key and value in the OWIN environment. + + The type of the value. + The key of the value to set. + The value to set. + This instance. + + + + This wraps OWIN environment dictionary and provides strongly typed accessors. + + + + + Gets the OWIN environment. + + The OWIN environment. + + + + Gets the request context. + + The request context. + + + + Gets or sets the optional owin.ResponseStatusCode. + + The optional owin.ResponseStatusCode, or 200 if not set. + + + + Gets or sets the the optional owin.ResponseReasonPhrase. + + The the optional owin.ResponseReasonPhrase. + + + + Gets or sets the owin.ResponseProtocol. + + The owin.ResponseProtocol. + + + + Gets the response header collection. + + The response header collection. + + + + Gets a collection used to manipulate the Set-Cookie header. + + A collection used to manipulate the Set-Cookie header. + + + + Gets or sets the Content-Length header. + + The Content-Length header. + + + + Gets or sets the Content-Type header. + + The Content-Type header. + + + + Gets or sets the Expires header. + + The Expires header. + + + + Gets or sets the E-Tag header. + + The E-Tag header. + + + + Gets or sets the owin.ResponseBody Stream. + + The owin.ResponseBody Stream. + + + + Registers for an event that fires when the response headers are sent. + + The callback method. + The callback state. + + + + Sets a 302 response status code and the Location header. + + The location where to redirect the client. + + + + Writes the given text to the response body stream using UTF-8. + + The response data. + + + + Writes the given bytes to the response body stream. + + The response data. + + + + Writes the given bytes to the response body stream. + + The response data. + The zero-based byte offset in the parameter at which to begin copying bytes. + The number of bytes to write. + + + + Asynchronously writes the given text to the response body stream using UTF-8. + + The response data. + A Task tracking the state of the write operation. + + + + Asynchronously writes the given text to the response body stream using UTF-8. + + The response data. + A token used to indicate cancellation. + A Task tracking the state of the write operation. + + + + Asynchronously writes the given bytes to the response body stream. + + The response data. + A Task tracking the state of the write operation. + + + + Asynchronously writes the given bytes to the response body stream. + + The response data. + A token used to indicate cancellation. + A Task tracking the state of the write operation. + + + + Asynchronously writes the given bytes to the response body stream. + + The response data. + The zero-based byte offset in the parameter at which to begin copying bytes. + The number of bytes to write. + A token used to indicate cancellation. + A Task tracking the state of the write operation. + + + + Gets a value from the OWIN environment, or returns default(T) if not present. + + The type of the value. + The key of the value to get. + The value with the specified key or the default(T) if not present. + + + + Sets the given key and value in the OWIN environment. + + The type of the value. + The key of the value to set. + The value to set. + This instance. + + + + Accessors for headers, query, forms, etc. + + + + + Get the associated value from the collection. Multiple values will be merged. + Returns null if the key is not present. + + + + + + + Get the associated value from the collection. Multiple values will be merged. + Returns null if the key is not present. + + + + + + + Get the associated values from the collection in their original format. + Returns null if the key is not present. + + + + + + + Used to mark which class in an assembly should be used for automatic startup. + + + + + Initializes a new instance of the class + + The startup class + + + + Initializes a new instance of the class + + A non-default configuration, e.g. staging. + The startup class + + + + Initializes a new instance of the class + + The startup class + Specifies which method to call + + + + Initializes a new instance of the class + + A non-default configuration, e.g. staging. + The startup class + Specifies which method to call + + + + A non-default configuration if any. e.g. Staging. + + + + + The startup class + + + + + The name of the configuration method + + + + + Used to create path based branches in your application pipeline. + The owin.RequestPathBase is not included in the evaluation, only owin.RequestPath. + Matching paths have the matching piece removed from owin.RequestPath and added to the owin.RequestPathBase. + + + + + Initializes a new instance of the class + + The normal pipeline taken for a negative match + + + + + Process an individual request. + + + + + + + Options for the Map middleware + + + + + The path to match + + + + + The branch taken for a positive match + + + + + Determines if the request should take a specific branch of the pipeline by passing the environment + to a user defined callback. + + + + + Initializes a new instance of the class + + The normal application pipeline + + + + + Process an individual request. + + + + + + + Options for the MapWhen middleware + + + + + The user callback that determines if the branch should be taken + + + + + The async user callback that determines if the branch should be taken + + + + + The branch taken for a positive match + + + + + This wraps OWIN environment dictionary and provides strongly typed accessors. + + + + + Create a new context with only request and response header collections. + + + + + Create a new wrapper. + + OWIN environment dictionary which stores state information about the request, response and relevant server state. + + + + Gets a wrapper exposing request specific properties. + + A wrapper exposing request specific properties. + + + + Gets a wrapper exposing response specific properties. + + A wrapper exposing response specific properties. + + + + Gets the Authentication middleware functionality available on the current request. + + The authentication middleware functionality available on the current request. + + + + Gets the OWIN environment. + + The OWIN environment. + + + + Gets or sets the host.TraceOutput environment value. + + The host.TraceOutput TextWriter. + + + + Gets a value from the OWIN environment, or returns default(T) if not present. + + The type of the value. + The key of the value to get. + The value with the specified key or the default(T) if not present. + + + + Sets the given key and value in the OWIN environment. + + The type of the value. + The key of the value to set. + The value to set. + This instance. + + + + Provides correct escaping for Path and PathBase values when needed to reconstruct a request or redirect URI string + + + + + Represents the empty path. This field is read-only. + + + + + Initialize the path string with a given value. This value must be in un-escaped format. Use + PathString.FromUriComponent(value) if you have a path value which is in an escaped format. + + The unescaped path to be assigned to the Value property. + + + + The unescaped path value + + + + + True if the path is not empty + + + + + Provides the path string escaped in a way which is correct for combining into the URI representation. + + The escaped path value + + + + Provides the path string escaped in a way which is correct for combining into the URI representation. + + The escaped path value + + + + Returns an PathString given the path as it is escaped in the URI format. The string MUST NOT contain any + value that is not a path. + + The escaped path as it appears in the URI format. + The resulting PathString + + + + Returns an PathString given the path as from a Uri object. Relative Uri objects are not supported. + + The Uri object + The resulting PathString + + + + Checks if this instance starts with or exactly matches the other instance. Only full segments are matched. + + + + + + + Checks if this instance starts with or exactly matches the other instance. Only full segments are matched. + + + Any remaining segments from this instance not included in the other instance. + + + + + Adds two PathString instances into a combined PathString value. + + The combined PathString value + + + + Combines a PathString and QueryString into the joined URI formatted string value. + + The joined URI formatted string value + + + + Compares this PathString value to another value. The default comparison is StringComparison.OrdinalIgnoreCase. + + The second PathString for comparison. + True if both PathString values are equal + + + + Compares this PathString value to another value using a specific StringComparison type + + The second PathString for comparison + The StringComparison type to use + True if both PathString values are equal + + + + Compares this PathString value to another value. The default comparison is StringComparison.OrdinalIgnoreCase. + + The second PathString for comparison. + True if both PathString values are equal + + + + Returns the hash code for the PathString value. The hash code is provided by the OrdinalIgnoreCase implementation. + + The hash code + + + + Operator call through to Equals + + The left parameter + The right parameter + True if both PathString values are equal + + + + Operator call through to Equals + + The left parameter + The right parameter + True if both PathString values are not equal + + + + Operator call through to Add + + The left parameter + The right parameter + The PathString combination of both values + + + + Operator call through to Add + + The left parameter + The right parameter + The PathString combination of both values + + + + Provides correct handling for QueryString value when needed to reconstruct a request or redirect URI string + + + + + Represents the empty query string. This field is read-only. + + + + + Initialize the query string with a given value. This value must be in escaped and delimited format without + a leading '?' character. + + The query string to be assigned to the Value property. + + + + Initialize a query string with a single given parameter name and value. The value is + + The unencoded parameter name + The unencoded parameter value + + + + The escaped query string without the leading '?' character + + + + + True if the query string is not empty + + + + + Provides the query string escaped in a way which is correct for combining into the URI representation. + A leading '?' character will be prepended unless the Value is null or empty. Characters which are potentially + dangerous are escaped. + + The query string value + + + + Provides the query string escaped in a way which is correct for combining into the URI representation. + A leading '?' character will be prepended unless the Value is null or empty. Characters which are potentially + dangerous are escaped. + + The query string value + + + + Returns an QueryString given the query as it is escaped in the URI format. The string MUST NOT contain any + value that is not a query. + + The escaped query as it appears in the URI format. + The resulting QueryString + + + + Returns an QueryString given the query as from a Uri object. Relative Uri objects are not supported. + + The Uri object + The resulting QueryString + + + + Indicates whether the current instance is equal to the other instance. + + + + + + + Indicates whether the current instance is equal to the other instance. + + + + + + + Returns the hash code for this instance. + + + + + + Compares the two instances for equality. + + + + + + + + Compares the two instances for inequality. + + + + + + + + Accessors for query, forms, etc. + + + + + Create a new wrapper + + + + + + Get the associated value from the collection. Multiple values will be merged. + Returns null if the key is not present. + + + + + + + Get the associated value from the collection. Multiple values will be merged. + Returns null if the key is not present. + + + + + + + Get the associated values from the collection in their original format. + Returns null if the key is not present. + + + + + + + + + + + + + + + + + + + A wrapper for the request Cookie header + + + + + Create a new wrapper + + + + + + Returns null rather than throwing KeyNotFoundException + + + + + + + + + + + + + + + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Conversion delegate must take one parameter.. + + + + + Looks up a localized string similar to The cookie key and options are larger than ChunksSize, leaving no room for data.. + + + + + Looks up a localized string similar to The chunked cookie is incomplete. Only {0} of the expected {1} chunks were found, totaling {2} characters. A client size limit may have been exceeded.. + + + + + Looks up a localized string similar to The type '{0}' does not match any known middleware pattern.. + + + + + Looks up a localized string similar to The OWIN key 'server.OnSendingHeaders' is not available for this request.. + + + + + Looks up a localized string similar to The class '{0}' does not have a constructor taking {1} arguments.. + + + + + Looks up a localized string similar to No conversion available between {0} and {1}.. + + + + + Looks up a localized string similar to The path must not end with a '/'. + + + + + Looks up a localized string similar to The path must start with a '/' followed by one or more characters.. + + + + + Looks up a localized string similar to The path is required. + + + + + Looks up a localized string similar to The query string must start with a '?' unless null or empty.. + + + + + A standard implementation of IAppBuilder + + + + + Initializes a new instance of the the type. + + + + + + + + + + + + Contains arbitrary properties which may added, examined, and modified by + components during the startup sequence. + + Returns . + + + + Adds a middleware node to the OWIN function pipeline. The middleware are + invoked in the order they are added: the first middleware passed to Use will + be the outermost function, and the last middleware passed to Use will be the + innermost. + + + The middleware parameter determines which behavior is being chained into the + pipeline. + + If the middleware given to Use is a Delegate, then it will be invoked with the "next app" in + the chain as the first parameter. If the delegate takes more than the single argument, + then the additional values must be provided to Use in the args array. + + If the middleware given to Use is a Type, then the public constructor will be + invoked with the "next app" in the chain as the first parameter. The resulting object + must have a public Invoke method. If the object has constructors which take more than + the single "next app" argument, then additional values may be provided in the args array. + + + Any additional args passed to Use will be passed as additional values, following the "next app" + parameter, when the OWIN call pipeline is build. + + They are passed as additional parameters if the middleware parameter is a Delegate, or as additional + constructor arguments if the middle parameter is a Type. + + + The IAppBuilder itself is returned. This enables you to chain your use statements together. + + + + + The New method creates a new instance of an IAppBuilder. This is needed to create + a tree structure in your processing, rather than a linear pipeline. The new instance share the + same Properties, but will be created with a new, empty middleware list. + + To create a tangent pipeline you would first call New, followed by several calls to Use on + the new builder, ending with a call to Build on the new builder. The return value from Build + will be the entry-point to your tangent pipeline. This entry-point may now be added to the + main pipeline as an argument to a switching middleware, which will either call the tangent + pipeline or the "next app", based on something in the request. + + That said - all of that work is typically hidden by a middleware like Map, which will do that + for you. + + The new instance of the IAppBuilder implementation + + + + The Build is called at the point when all of the middleware should be chained + together. This is typically done by the hosting component which created the app builder, + and does not need to be called by the startup method if the IAppBuilder is passed in. + + + The Type argument indicates which calling convention should be returned, and + is typically typeof() for the OWIN + calling convention. + + + Returns an instance of the pipeline's entry point. This object may be safely cast to the + type which was provided + + + + + Simple object used by AppBuilder as seed OWIN callable if the + builder.Properties["builder.DefaultApp"] is not set + + + + + Extension methods for IAppBuilder. + + + + + The Build is called at the point when all of the middleware should be chained + together. May be called to build pipeline branches. + + + The request processing entry point for this section of the pipeline. + + + + The Build is called at the point when all of the middleware should be chained + together. May be called to build pipeline branches. + + The application signature. + + The request processing entry point for this section of the pipeline. + + + + Adds converters for adapting between disparate application signatures. + + + + + + + Adds converters for adapting between disparate application signatures. + + + + + + + + + A wrapper for the response Set-Cookie header + + + + + Create a new wrapper + + + + + + Add a new cookie and value + + + + + + + Add a new cookie + + + + + + + + Sets an expired cookie + + + + + + Sets an expired cookie + + + + + + + Indicates if the client should include a cookie on "same-site" or "cross-site" requests. + + + + + Indicates the client should send the cookie with every requests coming from any origin. + + + + + Indicates the client should send the cookie with "same-site" requests, and with "cross-site" top-level navigations. + + + + + Indicates the client should only send the cookie with "same-site" requests. + + + + + Acts as the return value from calls to the IAuthenticationManager's AuthenticeAsync methods. + + + + + Create an instance of the result object + + Assigned to Identity. May be null. + Assigned to Properties. Contains extra information carried along with the identity. + Assigned to Description. Contains information describing the authentication provider. + + + + Contains the claims that were authenticated by the given AuthenticationType. If the authentication + type was not successful the Identity property will be null. + + + + + Contains extra values that were provided with the original SignIn call. + + + + + Contains description properties for the middleware authentication type in general. Does not + vary per request. + + + + + Contains information describing an authentication provider. + + + + + Initializes a new instance of the class + + + + + Initializes a new instance of the class + + + + + + Contains metadata about the authentication provider. + + + + + Gets or sets the name used to reference the authentication middleware instance. + + + + + Gets or sets the display name for the authentication provider. + + + + + Exposes the security.Challenge environment value as a strong type. + + + + + Exposes the security.SignIn environment value as a strong type. + + + + + Exposes the security.SignOut environment value as a strong type. + + + + + + + + + + + + + + Dictionary used to store state values about the authentication session. + + + + + Initializes a new instance of the class + + + + + Initializes a new instance of the class + + + + + + State values about the authentication session. + + + + + Gets or sets whether the authentication session is persisted across multiple requests. + + + + + Gets or sets the full path or absolute URI to be used as an http redirect response value. + + + + + Gets or sets the time at which the authentication ticket was issued. + + + + + Gets or sets the time at which the authentication ticket expires. + + + + + Gets or sets if refreshing the authentication session should be allowed. + + + + + Exposes the security.Challenge environment value as a strong type. + + + + + Initializes a new instance of the class + + + + + + + List of the authentication types that should send a challenge in the response. + + + + + Dictionary used to store state values about the authentication session. + + + + + Exposes the security.SignIn environment value as a strong type. + + + + + Initializes a new instance of the class. + + + + + + + Initializes a new instance of the class. + + + + + + + The identity associated with the user sign in. + + + + + The security principal associated with the user sign in. + + + + + Dictionary used to store state values about the authentication session. + + + + + Exposes the security.SignOut and security.SignOutProperties environment values as a strong type. + + + + + Initializes a new instance of the class + + + + + + Initializes a new instance of the class + + + + + + + List of the authentication types that should be revoked on sign out. + + + + + Dictionary used to store state values about the authentication session. + + + + + Used to interact with authentication middleware that have been chained in the pipeline + + + + + Returns the current user for the request + + + + + Exposes the security.Challenge environment value as a strong type. + + + + + Exposes the security.SignIn environment value as a strong type. + + + + + Exposes the security.SignOut environment value as a strong type. + + + + + Lists all of the description data provided by authentication middleware that have been chained + + The authentication descriptions + + + + Lists the description data of all of the authentication middleware which are true for a given predicate + + A function provided by the caller which returns true for descriptions that should be in the returned list + The authentication descriptions + + + + Call back through the middleware to ask for a specific form of authentication to be performed + on the current request + + Identifies which middleware should respond to the request + for authentication. This value is compared to the middleware's Options.AuthenticationType property. + Returns an object with the results of the authentication. The AuthenticationResult.Identity + may be null if authentication failed. Even if the Identity property is null, there may still be + AuthenticationResult.properties and AuthenticationResult.Description information returned. + + + + Called to perform any number of authentication mechanisms on the current request. + + Identifies one or more middleware which should attempt to respond + Returns the AuthenticationResult information from the middleware which responded. The + order is determined by the order the middleware are in the pipeline. Latest added is first in the list. + + + + Add information into the response environment that will cause the authentication middleware to challenge + the caller to authenticate. This also changes the status code of the response to 401. The nature of that + challenge varies greatly, and ranges from adding a response header or changing the 401 status code to + a 302 redirect. + + Additional arbitrary values which may be used by particular authentication types. + Identify which middleware should perform their alterations on the + response. If the authenticationTypes is null or empty, that means the + AuthenticationMode.Active middleware should perform their alterations on the response. + + + + Add information into the response environment that will cause the authentication middleware to challenge + the caller to authenticate. This also changes the status code of the response to 401. The nature of that + challenge varies greatly, and ranges from adding a response header or changing the 401 status code to + a 302 redirect. + + Identify which middleware should perform their alterations on the + response. If the authenticationTypes is null or empty, that means the + AuthenticationMode.Active middleware should perform their alterations on the response. + + + + Add information to the response environment that will cause the appropriate authentication middleware + to grant a claims-based identity to the recipient of the response. The exact mechanism of this may vary. + Examples include setting a cookie, to adding a fragment on the redirect url, or producing an OAuth2 + access code or token response. + + Contains additional properties the middleware are expected to persist along with + the claims. These values will be returned as the AuthenticateResult.properties collection when AuthenticateAsync + is called on subsequent requests. + Determines which claims are granted to the signed in user. The + ClaimsIdentity.AuthenticationType property is compared to the middleware's Options.AuthenticationType + value to determine which claims are granted by which middleware. The recommended use is to have a single + ClaimsIdentity which has the AuthenticationType matching a specific middleware. + + + + Add information to the response environment that will cause the appropriate authentication middleware + to grant a claims-based identity to the recipient of the response. The exact mechanism of this may vary. + Examples include setting a cookie, to adding a fragment on the redirect url, or producing an OAuth2 + access code or token response. + + Determines which claims are granted to the signed in user. The + ClaimsIdentity.AuthenticationType property is compared to the middleware's Options.AuthenticationType + value to determine which claims are granted by which middleware. The recommended use is to have a single + ClaimsIdentity which has the AuthenticationType matching a specific middleware. + + + + Add information to the response environment that will cause the appropriate authentication middleware + to revoke any claims identity associated the the caller. The exact method varies. + + Additional arbitrary values which may be used by particular authentication types. + Identifies which middleware should perform the work to sign out. + Multiple authentication types may be provided to clear out more than one cookie at a time, or to clear + cookies and redirect to an external single-sign out url. + + + + Add information to the response environment that will cause the appropriate authentication middleware + to revoke any claims identity associated the the caller. The exact method varies. + + Identifies which middleware should perform the work to sign out. + Multiple authentication types may be provided to clear out more than one cookie at a time, or to clear + cookies and redirect to an external single-sign out url. + + + + Logging extension methods for IAppBuilder. + + + + + Sets the server.LoggerFactory in the Properties collection. + + + + + + + Retrieves the server.LoggerFactory from the Properties collection. + + + + + + + Creates a new ILogger instance from the server.LoggerFactory in the Properties collection. + + + + + + + + Creates a new ILogger instance from the server.LoggerFactory in the Properties collection. + + + + + + + + Creates a new ILogger instance from the server.LoggerFactory in the Properties collection. + + + + + + + + Provides a default ILoggerFactory. + + + + + Provides a default ILoggerFactory based on System.Diagnostics.TraceSorce. + + + + + Provides an ILoggerFactory based on System.Diagnostics.TraceSource. + + + + + Initializes a new instance of the class. + + + Creates a factory named "Microsoft.Owin". + + + + + Initializes a new instance of the class. + + + + + + + Creates a new DiagnosticsLogger for the given component name. + + + + + + + A generic interface for logging. + + + + + Aggregates most logging patterns to a single method. This must be compatible with the Func representation in the OWIN environment. + + To check IsEnabled call WriteCore with only TraceEventType and check the return value, no event will be written. + + + + + + + + + + + Used to create logger instances of the given name. + + + + + Creates a new ILogger instance of the given name. + + + + + + + ILogger extension methods for common scenarios. + + + + + Checks if the given TraceEventType is enabled. + + + + + + + + Writes a verbose log message. + + + + + + + Writes an informational log message. + + + + + + + Writes a warning log message. + + + + + + + + Writes a warning log message. + + + + + + + + Writes an error log message. + + + + + + + Writes an error log message. + + + + + + + + Writes a critical log message. + + + + + + + Writes a critical log message. + + + + + + + + Contains the parts of an address. + + + + + Initializes a new instance. + + + + + + Initializes a new with the given parts. + + The scheme. + The host. + The port. + The path. + + + + Gets the internal dictionary for this collection. + + The internal dictionary for this collection. + + + + The uri scheme. + + + + + The uri host. + + + + + The uri port. + + + + + The uri path. + + + + + Creates a new + + A new + + + + Determines whether the specified object is equal to the current object. + + The other object. + true if the specified object is equal to the current object; otherwise, false. + + + + Determines whether the specified object is equal to the current object. + + The other object. + true if the specified object is equal to the current object; otherwise, false. + + + + Returns the hash code for this instance. + + The hash code for this instance. + + + + Determines whether two specified instances of are equal. + + The first object to compare. + The second object to compare. + true if left and right represent the same address; otherwise, false. + + + + Determines whether two specified instances of are not equal. + + The first object to compare. + The second object to compare. + true if left and right do not represent the same address; otherwise, false. + + + + Gets a specified key and value from the underlying dictionary. + + + The key. + + + + + Sets a specified key and value in the underlying dictionary. + + The key. + The value. + + + + + Wraps the host.Addresses list. + + + + + Initializes a new instance of the class. + + The address list to set to the collection. + + + + Gets the underlying address list. + + The underlying address list. + + + + Gets the number of elements in the collection. + + The number of elements in the collection. + + + + Gets the item with the specified index from the collection. + + The index. + The item with the specified index. + + + + Adds the specified address to the collection. + + The address to add to the collection. + + + + Gets the enumerator that iterates through the collection. + + The enumerator that can be used to iterate through the collection. + + + + Gets the enumerator that iterates through the collection. + + The enumerator that can be used to iterate through the collection. + + + + Creates a new empty instance of . + + A new empty instance of . + + + + Determines whether the current collection is equal to the specified collection. + + The other collection to compare to the current collection. + true if current collection is equal to the specified collection; otherwise, false. + + + + Determines whether the current collection is equal to the specified object. + + The object to compare to the current collection. + true if current collection is equal to the specified object; otherwise, false. + + + + Gets the hash code for this instance. + + The hash code for this instance. + + + + Determines whether the first collection is equal to the second collection. + + The first collection to compare. + The second collection to compare. + true if both collections are equal; otherwise, false. + + + + Determines whether the first collection is not equal to the second collection. + + The first collection to compare. + The second collection to compare. + true if both collections are not equal; otherwise, false. + + + + A wrapper for the IDictionary. + + + + + Initializes a new instance of the class. + + + + + + Gets or sets the string value for “owin.Version”. + + The string value for “owin.Version”. + + + + Gets or sets the function delegate for “builder.DefaultApp”. + + The function delegate for “builder.DefaultApp”. + + + + Gets or sets the action delegate for “builder.AddSignatureConversion”. + + The action delegate for “builder.AddSignatureConversion”. + + + + Gets or sets the string value for “host.AppName”. + + The string value for “host.AppName”. + + + + Gets or sets the text writer for “host.TraceOutput”. + + The text writer for “host.TraceOutput”. + + + + Gets or sets the cancellation token for “host.OnAppDisposing”. + + The cancellation token for “host.OnAppDisposing”. + + + + Gets or sets the address collection for “host.Addresses”. + + The address collection for “host.Addresses”. + + + + Gets or sets the list of “server.Capabilities”. + + The list of “server.Capabilities”. + + + + Gets the underlying dictionary for this instance. + + The underlying dictionary for this instance. + + + + Determines whether the current AppProperties is equal to the specified AppProperties. + + The other AppProperties to compare with the current instance. + true if the current AppProperties is equal to the specified AppProperties; otherwise, false. + + + + Determines whether the current AppProperties is equal to the specified object. + + The object to compare with the current instance. + true if the current AppProperties is equal to the specified object; otherwise, false. + + + + Returns the hash code for this instance. + + The hash code for this instance. + + + + Determines whether the first AppPProperties is equal to the second AppProperties. + + The first AppPropeties to compare. + The second AppPropeties to compare. + true if both AppProperties are equal; otherwise, false. + + + + Determines whether the first AppPProperties is not equal to the second AppProperties. + + The first AppPropeties to compare. + The second AppPropeties to compare. + true if both AppProperties are not equal; otherwise, false. + + + + Gets the value from the dictionary with the specified key. + + The type of the value. + The key of the value to get. + The value with the specified key. + + + + Sets the value with the specified key. + + The key of the value to set. + The value to set. + This instance. + + + + Represents the capabilities for the builder properties. + + + + + Initializes a new instance of the class. + + + + + + The underling IDictionary + + + + + Gets or sets the string value for "sendfile.Version" + + the string value for "sendfile.Version" + + + + Gets or sets the websocket version. + + The websocket version. + + + + Initializes a new instance of the class. + + A new instance of the class. + + + + Determines whether the current Capabilities instance is equal to the specified Capabilities. + + The other Capabilities to compare with the current instance. + true if the specified object is equal to the current object; otherwise, false. + + + + Determines whether the current Capabilities is equal to the specified object. + + The object to compare with the current instance. + true if the current Capabilities is equal to the specified object; otherwise, false. + + + + Returns the hash code for this instance. + + The hash code for this instance. + + + + Determines whether two specified instances of are equal. + + The first object to compare. + The second object to compare. + true if the two specified instances of are equal; otherwise, false. + + + + Determines whether two specified instances of are not equal. + + The first object to compare. + The second object to compare. + true if the two specified instances of are not equal; otherwise, false. + + + + Gets the value from the dictionary with the specified key. + + The type of the value. + The key of the value to get. + The value with the specified key. + + + + Sets the given key and value in the underlying dictionary. + + The key of the value to set. + The value to set. + This instance. + + + + Options used to create a new cookie. + + + + + Creates a default cookie with a path of '/'. + + + + + Gets or sets the domain to associate the cookie with. + + The domain to associate the cookie with. + + + + Gets or sets the cookie path. + + The cookie path. + + + + Gets or sets the expiration date and time for the cookie. + + The expiration date and time for the cookie. + + + + Gets or sets a value that indicates whether to transmit the cookie using Secure Sockets Layer (SSL)—that is, over HTTPS only. + + true to transmit the cookie only over an SSL connection (HTTPS); otherwise, false. + + + + Gets or sets a value that indicates whether a cookie is accessible by client-side script. + + true if a cookie is accessible by client-side script; otherwise, false. + + + + Gets or sets a value that indicates on which requests client should or should not send cookie back to the server. + Set to null to do not include SameSite attribute at all. + + SameSite attribute value or null if attribute must not be set. + + + + Provides helper methods for processing requests. + + + + + Parses an HTTP form body. + + The HTTP form body to parse. + The object containing the parsed HTTP form body. + + + + An abstract base class for a standard middleware pattern. + + + + + Instantiates the middleware with an optional pointer to the next component. + + + + + + The optional next component. + + + + + Process an individual request. + + + + + + + This wraps OWIN environment dictionary and provides strongly typed accessors. + + + + + Create a new context with only request and response header collections. + + + + + Create a new environment wrapper exposing request properties. + + OWIN environment dictionary which stores state information about the request, response and relevant server state. + + + + Gets the OWIN environment. + + The OWIN environment. + + + + Gets the request context. + + The request context. + + + + Gets or set the HTTP method. + + The HTTP method. + + + + Gets or set the HTTP request scheme from owin.RequestScheme. + + The HTTP request scheme from owin.RequestScheme. + + + + Returns true if the owin.RequestScheme is https. + + true if this request is using https; otherwise, false. + + + + Gets or set the Host header. May include the port. + + The Host header. + + + + Gets or set the owin.RequestPathBase. + + The owin.RequestPathBase. + + + + Gets or set the request path from owin.RequestPath. + + The request path from owin.RequestPath. + + + + Gets or set the query string from owin.RequestQueryString. + + The query string from owin.RequestQueryString. + + + + Gets the query value collection parsed from owin.RequestQueryString. + + The query value collection parsed from owin.RequestQueryString. + + + + Gets the uniform resource identifier (URI) associated with the request. + + The uniform resource identifier (URI) associated with the request. + + + + Gets or set the owin.RequestProtocol. + + The owin.RequestProtocol. + + + + Gets the request headers. + + The request headers. + + + + Gets the collection of Cookies for this request. + + The collection of Cookies for this request. + + + + Gets or sets the Content-Type header. + + The Content-Type header. + + + + Gets or sets the Cache-Control header. + + The Cache-Control header. + + + + Gets or sets the Media-Type header. + + The Media-Type header. + + + + Gets or set the Accept header. + + The Accept header. + + + + Gets or set the owin.RequestBody Stream. + + The owin.RequestBody Stream. + + + + Gets or sets the cancellation token for the request. + + The cancellation token for the request. + + + + Gets or set the server.LocalIpAddress. + + The server.LocalIpAddress. + + + + Gets or set the server.LocalPort. + + The server.LocalPort. + + + + Gets or set the server.RemoteIpAddress. + + The server.RemoteIpAddress. + + + + Gets or set the server.RemotePort. + + The server.RemotePort. + + + + Gets or set the server.User. + + The server.User. + + + + Asynchronously reads and parses the request body as a form. + + The parsed form data. + + + + Gets a value from the OWIN environment, or returns default(T) if not present. + + The type of the value. + The key of the value to get. + The value with the specified key or the default(T) if not present. + + + + Sets the given key and value in the OWIN environment. + + The type of the value. + The key of the value to set. + The value to set. + This instance. + + + + This wraps OWIN environment dictionary and provides strongly typed accessors. + + + + + Create a new context with only request and response header collections. + + + + + Creates a new environment wrapper exposing response properties. + + OWIN environment dictionary which stores state information about the request, response and relevant server state. + + + + Gets the OWIN environment. + + The OWIN environment. + + + + Gets the request context. + + The request context. + + + + Gets or sets the optional owin.ResponseStatusCode. + + The optional owin.ResponseStatusCode, or 200 if not set. + + + + Gets or sets the the optional owin.ResponseReasonPhrase. + + The the optional owin.ResponseReasonPhrase. + + + + Gets or sets the owin.ResponseProtocol. + + The owin.ResponseProtocol. + + + + Gets the response header collection. + + The response header collection. + + + + Gets a collection used to manipulate the Set-Cookie header. + + A collection used to manipulate the Set-Cookie header. + + + + Gets or sets the Content-Length header. + + The Content-Length header. + + + + Gets or sets the Content-Type header. + + The Content-Type header. + + + + Gets or sets the Expires header. + + The Expires header. + + + + Gets or sets the E-Tag header. + + The E-Tag header. + + + + Gets or sets the owin.ResponseBody Stream. + + The owin.ResponseBody Stream. + + + + Registers for an event that fires when the response headers are sent. + + The callback method. + The callback state. + + + + Sets a 302 response status code and the Location header. + + The location where to redirect the client. + + + + Writes the given text to the response body stream using UTF-8. + + The response data. + + + + Writes the given bytes to the response body stream. + + The response data. + + + + Writes the given bytes to the response body stream. + + The response data. + The zero-based byte offset in the parameter at which to begin copying bytes. + The number of bytes to write. + + + + Asynchronously writes the given text to the response body stream using UTF-8. + + The response data. + A Task tracking the state of the write operation. + + + + Asynchronously writes the given text to the response body stream using UTF-8. + + The response data. + A token used to indicate cancellation. + A Task tracking the state of the write operation. + + + + Asynchronously writes the given bytes to the response body stream. + + The response data. + A Task tracking the state of the write operation. + + + + Asynchronously writes the given bytes to the response body stream. + + The response data. + A token used to indicate cancellation. + A Task tracking the state of the write operation. + + + + Asynchronously writes the given bytes to the response body stream. + + The response data. + The zero-based byte offset in the parameter at which to begin copying bytes. + The number of bytes to write. + A token used to indicate cancellation. + A Task tracking the state of the write operation. + + + + Gets a value from the OWIN environment, or returns default(T) if not present. + + The type of the value. + The key of the value to get. + The value with the specified key or the default(T) if not present. + + + + Sets the given key and value in the OWIN environment. + + The type of the value. + The key of the value to set. + The value to set. + This instance. + + +