From 5086d93d49dcbf720e635cfa4fdf23d2a556b0c3 Mon Sep 17 00:00:00 2001 From: Antonio Gonzalez Date: Mon, 27 Jul 2020 10:36:31 -0700 Subject: [PATCH 1/6] =?UTF-8?q?se=20agrego=20un=20filtro=20de=20busqueda?= =?UTF-8?q?=20sobre=20folios=20de=20movimientos=20y=20ahora=20para=20hacer?= =?UTF-8?q?=20una=20correci=C3=B3n=20se=20puede=20hacer=20seccionado=20sin?= =?UTF-8?q?=20necesariamente=20mover=20toda=20la=20cantidad=20del=20movimi?= =?UTF-8?q?ento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App_Code/ClsInventarios.vb | 3 ++- Inventarios/AjustesSeccionAlmacen.aspx | 17 +++++++++++--- Inventarios/AjustesSeccionAlmacen.aspx.vb | 28 +++++++++++++++++++---- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/App_Code/ClsInventarios.vb b/App_Code/ClsInventarios.vb index b792e8c86..4f1733273 100644 --- a/App_Code/ClsInventarios.vb +++ b/App_Code/ClsInventarios.vb @@ -4780,13 +4780,14 @@ Public Class ClsInventarios #Region "MOVIMIENTOS DETALLE SECCION ALMACEN" - Public Function GetMovimientosDetalleSeccionesAlmacen(CveAlmacen As Integer, CveClasificacion As Integer, CveEmpresa As Integer) As Boolean + Public Function GetMovimientosDetalleSeccionesAlmacen(CveAlmacen As Integer, CveClasificacion As Integer, CveEmpresa As Integer, Folio As String) As Boolean Dim Retorno As Boolean = False DataAdapter("PA_Inv_MovimientosDetalleAjusteSeccionesGet") With SqlAdapter.SelectCommand.Parameters .Add("@CveAlmacen", SqlDbType.Int).Value = CveAlmacen .Add("@CveClasificacion", SqlDbType.Int).Value = CveClasificacion .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa + .Add("@Folio", SqlDbType.NVarChar).Value = Folio End With Try SqlAdapter.Fill(Data) diff --git a/Inventarios/AjustesSeccionAlmacen.aspx b/Inventarios/AjustesSeccionAlmacen.aspx index 4fc1c050d..7ec3297eb 100644 --- a/Inventarios/AjustesSeccionAlmacen.aspx +++ b/Inventarios/AjustesSeccionAlmacen.aspx @@ -46,6 +46,10 @@ + +
+ +
@@ -62,10 +66,17 @@ - - + <%----%> + - + <%----%> + + + + + + + diff --git a/Inventarios/AjustesSeccionAlmacen.aspx.vb b/Inventarios/AjustesSeccionAlmacen.aspx.vb index 726db4464..f4d99325d 100644 --- a/Inventarios/AjustesSeccionAlmacen.aspx.vb +++ b/Inventarios/AjustesSeccionAlmacen.aspx.vb @@ -33,7 +33,8 @@ Partial Class Inventarios_AjustesSeccionAlmacen Private Sub CargaDatos() Dim ObjInv As New ClsInventarios - If ObjInv.GetMovimientosDetalleSeccionesAlmacen(DdlAlmacen.SelectedValue.ToEntero, DdlClasificaciones.SelectedValue.ToEntero, UsuarioActual.CveEmpresa) Then + Dim FolioAux As String = If(TxtFolioFiltro.Text.Length > 0, TxtFolioFiltro.Text, "-1") + If ObjInv.GetMovimientosDetalleSeccionesAlmacen(DdlAlmacen.SelectedValue.ToEntero, DdlClasificaciones.SelectedValue.ToEntero, UsuarioActual.CveEmpresa, FolioAux) Then GvD.DataSource = ObjInv.DtResultados End If @@ -48,6 +49,14 @@ Partial Class Inventarios_AjustesSeccionAlmacen e.Row.FCDropDownList("DDlS").DataSource = GlobalDTSeccionAlmacen(UsuarioActual.CveEmpresa, DdlAlmacen.SelectedValue.ToEntero) e.Row.FCDropDownList("DDlS").DataBind() + Dim ExistenciasAux As Decimal = e.Row.DataKey("Existencia").ToDecimal + e.Row.FCRangeValidator("RVR").Enabled = ExistenciasAux > 0 + If ExistenciasAux > 0 Then + e.Row.FCRangeValidator("RVR").MaximumValue = ExistenciasAux + Else + e.Row.FCCheckBox("Chk").Visible = False + e.Row.FCRangeValidator("RVR").MaximumValue = 0 + End If End If End Sub @@ -77,11 +86,12 @@ Partial Class Inventarios_AjustesSeccionAlmacen Dim CveMovimientoDetalleEntrada As Integer = 0 Dim Cont As Integer = 0 Dim Lista As New Hashtable + Dim Cantidad As Decimal = 0 For Each gvr As GridViewRow In GvD.Rows 'que este seleccionado y que tenga diferente seccion If gvr.FCCheckBox("Chk").Checked AndAlso gvr.FCDropDownList("DDlS").SelectedValue.ToEntero <> gvr.DataKey("CveSeccionAlmacen").ToEntero Then - + Cantidad = gvr.FCTextBox("TxtCantidad").Text.ToDecimal() If gvr.DataKey("CveSeccionAlmacen").ToEntero > 0 Then ObjPS.UpdateAplicaSeccionAlmacen(gvr.DataKey("CvePS").ToEntero, UsuarioActual.CveEmpresa, True) Else @@ -89,7 +99,7 @@ Partial Class Inventarios_AjustesSeccionAlmacen End If If Not Lista.ContainsKey(gvr.DataKey("CvePS").ToEntero) Then Lista.Add(gvr.DataKey("CvePS").ToEntero, gvr.FCDropDownList("DDlS").SelectedValue.ToEntero) 'guardo que dato le corresponde - If Not ObjInventario.AddMovimientoDetalle(CveMovimientoSalida, gvr.DataKey("Existencia").ToDecimal, gvr.DataKey("CveUM").ToEntero, gvr.DataKey("CvePS").ToEntero, 0, -1, CveSeccionAlmacen:=gvr.DataKey("CveSeccionAlmacen").ToEntero, Serie:=gvr.DataKey("Serie"), Lote:=gvr.DataKey("Lote"), FechaCaducidad:=gvr.DataKey("FechaCaducidad").ToDate) Then + If Not ObjInventario.AddMovimientoDetalle(CveMovimientoSalida, Cantidad, gvr.DataKey("CveUM").ToEntero, gvr.DataKey("CvePS").ToEntero, 0, -1, CveSeccionAlmacen:=gvr.DataKey("CveSeccionAlmacen").ToEntero, Serie:=gvr.DataKey("Serie"), Lote:=gvr.DataKey("Lote"), FechaCaducidad:=gvr.DataKey("FechaCaducidad").ToDate) Then ErrorMovInv = True TextoError = "Ocurrió un error al guardar los movimientos de salida" Exit For @@ -109,7 +119,7 @@ Partial Class Inventarios_AjustesSeccionAlmacen For Each Row As DataRow In resultado.Rows Dim CvePS = Row("CvePS").ToString().ToEntero() - Dim Cantidad As Decimal = Row("Cantidad").ToString().ToDecimal() + 'Dim Cantidad As Decimal = Row("Cantidad").ToString().ToDecimal() Dim PU As Decimal = Row("PUOriginal").ToString().ToDecimal() Dim CveUM As Integer = Row("CveUM").ToString().ToEntero() Dim CveSeccionAlmacen As Integer = Lista(Row("CvePS").ToString().ToEntero()) 'GvD.Rows(ind).FCDropDownList("DDlS").SelectedValue.ToEntero ' IfNull(Row("CveSeccionAlmacen"), "-1").ToString().ToEntero() @@ -288,7 +298,7 @@ Partial Class Inventarios_AjustesSeccionAlmacen Try Dim DtExistenciasSecciones As DataTable = Nothing - If ObjInventario.GetMovimientosDetalleSeccionesAlmacen(DdlAlmacenExcel.SelectedValue.ToEntero, -1, UsuarioActual.CveEmpresa) Then + If ObjInventario.GetMovimientosDetalleSeccionesAlmacen(DdlAlmacenExcel.SelectedValue.ToEntero, -1, UsuarioActual.CveEmpresa, "-1") Then DtExistenciasSecciones = ObjInventario.DtResultados.Copy() End If @@ -447,4 +457,12 @@ Partial Class Inventarios_AjustesSeccionAlmacen End If End Sub + Protected Sub Chk_Click(sender As Object, e As EventArgs) + Dim row As GridViewRow = (CType((CType(sender, CheckBox)).NamingContainer, GridViewRow)) + Dim ExistenciaBackup As Integer = row.DataKey("Existencia").ToEntero() + row.FCTextBox("TxtCantidad").Enabled = Not row.FCTextBox("TxtCantidad").Enabled + If Not row.FCTextBox("TxtCantidad").Enabled Then + row.FCTextBox("TxtCantidad").Text = ExistenciaBackup + End If + End Sub End Class \ No newline at end of file From 5338f397713767bc2d4ba612b0e943ccb196fa85 Mon Sep 17 00:00:00 2001 From: Antonio Gonzalez Date: Tue, 28 Jul 2020 16:57:55 -0700 Subject: [PATCH 2/6] - --- Ventas/ProductosServicios.aspx | 438 ++++++++++++++------------ Ventas/ProductosServicios.aspx.vb | 16 +- Ventas/RepRecuperacionPeriodo.aspx.cs | 2 +- Ventas/Ventas.aspx.vb | 2 +- 4 files changed, 245 insertions(+), 213 deletions(-) diff --git a/Ventas/ProductosServicios.aspx b/Ventas/ProductosServicios.aspx index 075222523..089baf909 100644 --- a/Ventas/ProductosServicios.aspx +++ b/Ventas/ProductosServicios.aspx @@ -549,11 +549,13 @@
+
+
@@ -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 e615e6395a257c85d3129e9b463b7091f7015f74 Mon Sep 17 00:00:00 2001 From: JORGE LUIS CAUDILLO ESPARZA Date: Wed, 29 Jul 2020 06:43:12 -0700 Subject: [PATCH 3/6] --- App_Code/ClsRH.vb | 5 +- Ashx/SIGWeb.ashx | 10 +- CRM/RepAcercamientosProcesos.aspx | 94 ++++++++++++- CRM/RepAcercamientosProcesos.aspx.cs | 15 +- CRM/RepAcercamientosProcesosDetalle.aspx | 146 +++++++++++++++++--- CRM/RepAcercamientosProcesosDetalle.aspx.cs | 34 ++--- CRM/RepAcercamientosRechazos.aspx.cs | 12 +- LogIn.aspx | 37 +++-- LogIn.aspx.vb | 65 ++++++++- RH/ActualizacionMasiva.aspx | 12 ++ RH/ActualizacionMasiva.aspx.vb | 7 +- RH/Organigrama.aspx | 64 +++++++-- RH/Organigrama.aspx.vb | 35 +++-- RH/Personal.aspx | 4 +- 14 files changed, 443 insertions(+), 97 deletions(-) diff --git a/App_Code/ClsRH.vb b/App_Code/ClsRH.vb index a13e094b3..000220165 100644 --- a/App_Code/ClsRH.vb +++ b/App_Code/ClsRH.vb @@ -1973,7 +1973,7 @@ chkAplicaVacacion As Boolean, chkAplicaIncapacidad As Boolean, chkAplicaRetardo End Try Return Retorno End Function - Public Function UpdateSalarios(CvePersonal As Integer, Fecha As String, CveEmpresa As Integer, SalarioDiario As Double, SDI As Double, SalarioDiarioSS As Double, SalarioDiarioPago As Double) As Boolean + Public Function UpdateSalarios(CvePersonal As Integer, Fecha As String, CveEmpresa As Integer, SalarioDiario As Double, SDI As Double, SalarioDiarioSS As Double, SalarioDiarioPago As Double, Optional CalcularSDI As Boolean = False) As Boolean Dim Retorno As Boolean = False SqlDataAdapter("PA_RH_PersonalUpdateSalarios") With SqlAdapter.SelectCommand.Parameters @@ -1983,7 +1983,8 @@ chkAplicaVacacion As Boolean, chkAplicaIncapacidad As Boolean, chkAplicaRetardo .Add("@SalarioDiarioPago", SqlDbType.Money).Value = SalarioDiarioPago .Add("@SalarioDiario", SqlDbType.Money).Value = SalarioDiario .Add("@SDI", SqlDbType.Money).Value = SDI - .Add("@SalarioDiarioSS", SqlDbType.Money).Value = SalarioDiarioSS + .Add("@SalarioDiarioSS", SqlDbType.Money).Value = SalarioDiarioSS + .Add("@CalcularSDI", SqlDbType.Bit).Value = CalcularSDI End With Try SqlAdapter.Fill(Data) diff --git a/Ashx/SIGWeb.ashx b/Ashx/SIGWeb.ashx index dd6cb5620..e53a90a5f 100644 --- a/Ashx/SIGWeb.ashx +++ b/Ashx/SIGWeb.ashx @@ -61,7 +61,7 @@ Public Class SIGWeb : Implements IHttpHandler, IRequiresSessionState Dim correo As String = "" Dim sitio As String = "" Dim cuerpo As String = "" - Dim obj = context.Request("Nombre") + Dim obj = context.Request("Nombre") 'Nombre=' + $('#Nombre').val() +'Correo=' + $('#Correo').val() +'Sitio=' + $('#Sitio').val() +'Cuerpo=' + $('#Cuerpo').val() + If Not IsNothing(obj) Then nombre = obj.ToString() End If @@ -75,11 +75,11 @@ Public Class SIGWeb : Implements IHttpHandler, IRequiresSessionState End If obj = context.Request("Cuerpo") If Not IsNothing(obj) Then - cuerpo = obj.ToString() + cuerpo = obj.ToString().Replace("< ", "<") End If - Dim Body As String = String.Format("Nombre : {0}
Nombre : {0}
Correo : {1}
Sitio : {2}

{3}", nombre, correo, sitio, cuerpo) - Dim para As String = "rene.molina@adssistemas.mx,sig.buzon@gmail.com,julian@adssistemas.mx;paola@adssistemas.mx;" - para = "caudillo.90d@gmail.com" + Dim Body As String = String.Format("Prospecto : {0}
Correo : {1}
Sitio : {2}

{3}", nombre, correo, sitio, cuerpo) + Dim para As String = "rene.molina@adssistemas.mx,sig.buzon@gmail.com,julian@adssistemas.mx;paola@adssistemas.mx;caudillo.90d@gmail.com;" + 'para = "" Dim Mail As New ClsSisMail() If Mail.SendMail(ClsPaginas.EmpresaNotificaciones, para, "NotificaciónProspecto", Body) Then retorno = "true" diff --git a/CRM/RepAcercamientosProcesos.aspx b/CRM/RepAcercamientosProcesos.aspx index c88c06c77..e38a869ea 100644 --- a/CRM/RepAcercamientosProcesos.aspx +++ b/CRM/RepAcercamientosProcesos.aspx @@ -5,8 +5,7 @@ - + Reporte Detalle de los Acercamientos Procesos - + - + -
  • -
  • +
  • - + - - - + + + - -
    + + <%--
    @@ -141,23 +158,112 @@
    +
    --%> + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + Consultar +
    +
    +
    + + + +
    +
    + +
    + + + + +
    + + +
    +
    +
    +
    + +
    + + + + +
    + + +
    + +
    +
    - - + + + - HyperLink + <%-- --%> - + - + @@ -195,6 +301,6 @@ - + diff --git a/CRM/RepAcercamientosProcesosDetalle.aspx.cs b/CRM/RepAcercamientosProcesosDetalle.aspx.cs index 5864191c0..fe8ab3eb8 100644 --- a/CRM/RepAcercamientosProcesosDetalle.aspx.cs +++ b/CRM/RepAcercamientosProcesosDetalle.aspx.cs @@ -80,7 +80,6 @@ public partial class CRM_RepAcercamientosProcesosDetalle : ClsPaginas { if (!IsPostBack) { - CargaDdl(); RCveTipoProceso = Request["CveTipoProceso"] == null ? -1 : Request["CveTipoProceso"].ToString().ToEntero(); RcveVendedor = Request["cveVendedor"] == null ? -1 : Request["cveVendedor"].ToString().ToEntero(); RcveMedioCaptacion = Request["cveMedioCaptacion"] == null ? -1 : Request["cveMedioCaptacion"].ToString().ToEntero(); @@ -109,6 +108,7 @@ public partial class CRM_RepAcercamientosProcesosDetalle : ClsPaginas break; } DdlTipoProceso.SelectedValueExist(RCveTipoProceso); + CargaDdl(); //DdlGrupo1.SelectedValueExist(idgrupo1); @@ -202,22 +202,22 @@ public partial class CRM_RepAcercamientosProcesosDetalle : ClsPaginas protected void LnkConsultar_Click(object sender, EventArgs e) { - RCveTipoProceso = DdlTipoProceso.SelectedValue.ToEntero(); - switch (RCveTipoProceso) - { - case 1: - RcveVendedor = Request["CveGrupo1"] == null ? -1 : Request["CveGrupo1"].ToString().ToEntero(); - break; - case 2: - RcveMedioCaptacion = Request["CveGrupo1"] == null ? -1 : Request["CveGrupo1"].ToString().ToEntero(); - break; - case 3: - RcveProbabilidadAcercamiento = Request["CveGrupo1"] == null ? -1 : Request["CveGrupo1"].ToString().ToEntero(); - break; - case 4: - RsFecha = Request["CveGrupo1"] == null ? "" : Request["CveGrupo1"].ToString(); - break; - } + //RCveTipoProceso = DdlTipoProceso.SelectedValue.ToEntero(); + //switch (RCveTipoProceso) + //{ + // case 1: + // RcveVendedor = Request["CveGrupo1"] == null ? -1 : Request["CveGrupo1"].ToString().ToEntero(); + // break; + // case 2: + // RcveMedioCaptacion = Request["CveGrupo1"] == null ? -1 : Request["CveGrupo1"].ToString().ToEntero(); + // break; + // case 3: + // RcveProbabilidadAcercamiento = Request["CveGrupo1"] == null ? -1 : Request["CveGrupo1"].ToString().ToEntero(); + // break; + // case 4: + // RsFecha = Request["CveGrupo1"] == null ? "" : Request["CveGrupo1"].ToString(); + // break; + //} RsFechaIni = TxtFechaInicio.Text.Length > 0 ? TxtFechaInicio.Text.ToDateTime().ToString("yyyy/MM/dd") : ""; RsFechaFin = TxtFechaFin.Text.Length > 0 ? TxtFechaFin.Text.ToDateTime().ToString("yyyy/MM/dd") : ""; RcveVendedor = DdlVendedor.SelectedValue.ToEntero(); diff --git a/CRM/RepAcercamientosRechazos.aspx.cs b/CRM/RepAcercamientosRechazos.aspx.cs index 2556b6ca7..9a1efc92f 100644 --- a/CRM/RepAcercamientosRechazos.aspx.cs +++ b/CRM/RepAcercamientosRechazos.aspx.cs @@ -128,6 +128,12 @@ public partial class CRM_RepAcercamientosRechazos : ClsPaginas BoundField test = new BoundField(); test.DataField = "Grupo1"; test.HeaderText = ""; + HyperLinkField hypt = new HyperLinkField(); + hypt.DataTextField = $"Total"; + hypt.HeaderText = $"Total"; + hypt.DataNavigateUrlFields = new string[] { "CveGrupo1", "CveGrupo2" , "Grupo1" }; + string strfilstros = string.Format("&cveVendedor={0}&cveMedioCaptacion={1}&cveProbabilidadAcercamiento={2}", cveVendedor, cveMedioCaptacion, cveProbabilidadAcercamiento); + hypt.DataNavigateUrlFormatString = $"/CRM/RepAcercamientosProcesosDetalle.ASPX?CveTipoProceso={cveTipoProceso}&CveGrupo1={{0}}&CveGrupo2={{1}}&FechaInicio={TxtFechaInicio.Text}&FechaFin={TxtFechaFin.Text}{strfilstros}"; switch (idgrupo1) { case 1: @@ -145,15 +151,11 @@ public partial class CRM_RepAcercamientosRechazos : ClsPaginas case 4: test.HeaderText = "Fecha"; Agrupador = "Fecha"; + hypt.DataNavigateUrlFormatString = $"/CRM/RepAcercamientosProcesosDetalle.ASPX?CveTipoProceso={cveTipoProceso}&CveGrupo1={{0}}&CveGrupo2={{1}}&FechaInicio={{2}}&FechaFin={{2}}{strfilstros}"; break; } GVRepAcercamientosEtapas.Columns.Add(test); - HyperLinkField hypt = new HyperLinkField(); - hypt.DataTextField = $"Total"; - hypt.HeaderText = $"Total"; - hypt.DataNavigateUrlFields = new string[] { "CveGrupo1", "CveGrupo2" }; - hypt.DataNavigateUrlFormatString = $"/CRM/RepAcercamientosProcesosDetalle.ASPX?CveTipoProceso={cveTipoProceso}&CveGrupo1={{0}}&CveGrupo2={{1}}&FechaInicio={TxtFechaInicio.Text}&FechaFin={TxtFechaFin.Text}"; GVRepAcercamientosEtapas.Columns.Add(hypt); foreach (DataRow row in dte.Rows) { diff --git a/LogIn.aspx b/LogIn.aspx index b391e24ef..80d75be74 100644 --- a/LogIn.aspx +++ b/LogIn.aspx @@ -18,7 +18,7 @@ <%: Styles.Render("~/Metronic/assets/global/css/css") %> - + <%: Scripts.Render("~/bundles/modernizr") %> @@ -69,13 +69,13 @@
    - +
    - - + +
    + +
    <%----%>
    diff --git a/RH/Organigrama.aspx.vb b/RH/Organigrama.aspx.vb index 84175ea43..190813a3a 100644 --- a/RH/Organigrama.aspx.vb +++ b/RH/Organigrama.aspx.vb @@ -86,14 +86,8 @@ Partial Class RH_Organigrama CveEmpresaFiltro = UsuarioActual.CveEmpresa NivelOrg = If(rgx.IsMatch(txtNivel.Text), txtNivel.Text.ToEntero, NivelOrg) txtNivel.Text = "" - DdlSupervisorOrganigrama.SelectedIndex = 0 - ScriptManager.RegisterClientScriptBlock(Me, [GetType], "mykey", "drawChart()", True) 'ejecutamos la funcion de js para que haga la consulta de los registros - End Sub + 'DdlSupervisorOrganigrama.SelectedIndex = 0 -#End Region - - - Public Shared Function FetchData() As List(Of Object) Dim ObjRH As New ClsRH Dim DtTemporal As New DataTable Dim chartData As New List(Of Object)() @@ -110,8 +104,33 @@ Partial Class RH_Organigrama chartData.Add(New Object() {headerEmpleado, If(nombreEmpleado = nombreSuperior, "", nombreSuperior), puesto}) Next End If + Dim str As String = (New Script.Serialization.JavaScriptSerializer()).Serialize(chartData) + LblJson.Text = str + 'ScriptManager.RegisterClientScriptBlock(Me, [GetType], "mykey", "drawChart()", True) 'ejecutamos la funcion de js para que haga la consulta de los registros + End Sub - Return chartData +#End Region + + + Public Shared Function FetchData() As String + Dim ObjRH As New ClsRH + Dim DtTemporal As New DataTable + Dim chartData As New List(Of Object)() + + If ObjRH.GetOrganigrama(CveEmpresaFiltro, CveCabecera, NivelOrg) Then + DtTemporal = ObjRH.DtResultados.Copy + + For Each renglon As DataRow In DtTemporal.Rows + Dim nombreEmpleado As String = renglon("nombreEmpleado").ToString + Dim nombreSuperior As String = renglon("nombreSuperior").ToString + Dim puesto As String = renglon("puesto").ToString + Dim headerEmpleado As String = String.Format("{{{2}v{2}:{2}{0}{2},{2}f{2}:{2}{0}
    {1}
    {2}}}", nombreEmpleado, puesto, ControlChars.Quote) 'este es el JSON que da formato a los subtitulos se hace en String y la funcion lo hace JSON + + chartData.Add(New Object() {headerEmpleado, If(nombreEmpleado = nombreSuperior, "", nombreSuperior), puesto}) + Next + End If + Dim str As String = (New Script.Serialization.JavaScriptSerializer()).Serialize(chartData) + Return str End Function End Class diff --git a/RH/Personal.aspx b/RH/Personal.aspx index 9dce78f67..9dabad475 100644 --- a/RH/Personal.aspx +++ b/RH/Personal.aspx @@ -715,7 +715,7 @@ - +
    @@ -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 4/6] =?UTF-8?q?se=20agreg=C3=B3=20el=20rol=20de=20almaceni?= =?UTF-8?q?sta=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 5/6] --- 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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 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 6/6] --- 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. + + +