Sidub.Platform.Authentication.IsolatedFunction 1.10.27

Prefix Reserved
dotnet add package Sidub.Platform.Authentication.IsolatedFunction --version 1.10.27
                    
NuGet\Install-Package Sidub.Platform.Authentication.IsolatedFunction -Version 1.10.27
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Sidub.Platform.Authentication.IsolatedFunction" Version="1.10.27" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Sidub.Platform.Authentication.IsolatedFunction" Version="1.10.27" />
                    
Directory.Packages.props
<PackageReference Include="Sidub.Platform.Authentication.IsolatedFunction" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Sidub.Platform.Authentication.IsolatedFunction --version 1.10.27
                    
#r "nuget: Sidub.Platform.Authentication.IsolatedFunction, 1.10.27"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Sidub.Platform.Authentication.IsolatedFunction@1.10.27
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Sidub.Platform.Authentication.IsolatedFunction&version=1.10.27
                    
Install as a Cake Addin
#tool nuget:?package=Sidub.Platform.Authentication.IsolatedFunction&version=1.10.27
                    
Install as a Cake Tool

Sidub.Platform

The Sidub Platform provides business developers with common critical tools — data persistence, filtering, localization, cryptography, authentication, and more. All libraries target .NET Standard 2.0+ for broad compatibility across .NET Framework, .NET Core, Xamarin, Blazor, and modern .NET applications.

Packages

Package Description
Sidub.Platform.Core Entity model, attributes, partition strategies, serialization, service registry
Sidub.Platform.Filter Expression-tree and builder-based filter framework with OData, Gremlin, and MySQL parsers
Sidub.Platform.Storage Query service abstraction, entity queries with predicate and partition support
Sidub.Platform.Storage.Http HTTP / REST storage connector
Sidub.Platform.Storage.Gremlin Gremlin / Azure Cosmos DB graph storage connector
Sidub.Platform.Storage.MySql MySQL storage connector
Sidub.Platform.Authentication Authentication abstractions and credential management
Sidub.Platform.Authentication.Credentials.Azure Azure credential providers (Managed Identity, Service Principal, etc.)
Sidub.Platform.Authentication.Http HTTP authentication handlers
Sidub.Platform.Authentication.Gremlin Gremlin authentication handlers
Sidub.Platform.Authentication.MySql MySQL authentication handlers
Sidub.Platform.Authentication.SignalR SignalR authentication handlers
Sidub.Platform.Authentication.IsolatedFunction Azure Isolated Functions authentication integration
Sidub.Platform.Authorization Authorization abstractions
Sidub.Platform.Authorization.IsolatedFunction Azure Isolated Functions authorization integration
Sidub.Platform.Cryptography Cryptographic operations — signing, verification, key management
Sidub.Platform.Cryptography.AzureKeyVault Azure Key Vault cryptography provider
Sidub.Platform.Localization Localization and resource management
Sidub.Platform.NumberSequence Number sequence generation

Getting started

Register the platform services using the provided extension methods:

var services = new ServiceCollection();

// Core platform services (entity model, serialization, service registry)
services.AddSidubPlatform();

// Storage query services
services.AddSidubStorage();

// Filter services — specify your parser type(s)
services.AddSidubFilter(FilterParserType.OData);

Entity model

Entities are defined as classes or interfaces decorated with attributes from Sidub.Platform.Core.Attributes. These attributes control field mapping, key identification, serialization, and partition behavior.

[Entity("widget")]
public class Widget : IEntity, IRuntimePartitionStrategy
{
    [EntityKey<Guid>("id")]
    public Guid Id { get; set; }

    [EntityField<string>("name")]
    public string Name { get; set; } = string.Empty;

    [EntityField<decimal>("price")]
    public decimal Price { get; set; }

    [EntityPartitionKey]
    [EntityKey<string>("tenantId")]
    public string TenantId { get; set; } = string.Empty;
}
Attribute Purpose
[Entity("name")] Marks a class as an entity with a storage label; optional version parameter for schema evolution
[EntityKey<T>("name")] Designates a property as a key field
[EntityField<T>("name")] Maps a property to a named storage field
[EntityPartitionKey] Marks the property that provides partition values at runtime; must be stacked on [EntityKey]

Partition strategies

Partitioning determines how entities are distributed across logical storage partitions. The strategy is declared by implementing a marker interface on the entity class.

Strategy Interface Behavior
Runtime IRuntimePartitionStrategy The entity designates a property with [EntityPartitionKey]. The partition value is driven by data — each entity instance carries its own partition key value.
Global IGlobalPartitionStrategy All entities share a single logical partition (constant value "global"). Useful for small lookup tables or reference data.
Typed ITypedPartitionStrategy Partition value derived from the entity type itself.

Runtime partition example

[Entity("widget")]
public class Widget : IEntity, IRuntimePartitionStrategy
{
    [EntityKey<Guid>("id")]
    public Guid Id { get; set; }

    [EntityField<string>("name")]
    public string Name { get; set; } = string.Empty;

    [EntityPartitionKey]
    [EntityKey<string>("tenantId")]
    public string TenantId { get; set; } = string.Empty;
}

The TenantId property is both an entity key and the partition key. When querying, you can scope to a specific partition or perform cross-partition scans.

Querying

Query types

The storage layer provides two generic query types that support inline predicate expressions and partition scoping.

Query type Purpose
EntityRecordQuery<TEntity> Retrieve a single entity matching a predicate
EntityEnumerableQuery<TEntity> Retrieve multiple entities, optionally filtered

Both implement IQueryPartition, allowing partition-scoped queries on entities that use IRuntimePartitionStrategy.

Basic queries

// Single record by key
var query = new EntityRecordQuery<Widget>(w => w.Id == widgetId);
var widget = await queryService.Execute(connector, query);

// All records (no filter)
var query = new EntityEnumerableQuery<Widget>();
var results = queryService.Execute(connector, query);
await foreach (var widget in results) { /* ... */ }

// Filtered list
var query = new EntityEnumerableQuery<Widget>(w => w.Price > 10.0m);

Partition-scoped queries

When querying a partitioned entity, you can provide a partition value to scope the query to a specific partition, or omit it to perform a cross-partition scan.

// Partition via type-safe expression (recommended)
var query = new EntityRecordQuery<Widget>(
    predicate: w => w.Id == widgetId,
    partition: w => w.TenantId == "tenant-01");

// Partition via string value
var query = new EntityRecordQuery<Widget>(
    predicate: w => w.Id == widgetId,
    partitionValue: "tenant-01");

// Cross-partition scan (no partition specified — queries all partitions)
var query = new EntityEnumerableQuery<Widget>(w => w.Price > 10.0m);

// Partition-only (all entities within a partition)
var query = new EntityEnumerableQuery<Widget>(
    partition: w => w.TenantId == "tenant-01");

// Combined predicate + partition
var query = new EntityEnumerableQuery<Widget>(
    predicate: w => w.Name.Contains("Gadget"),
    partition: w => w.TenantId == "tenant-01");
Partition expression mechanics

When using the partition parameter, the expression must be an equality comparison against a property decorated with [EntityPartitionKey]:

// Captured variable works
var tenantId = "tenant-01";
var query = new EntityRecordQuery<Widget>(
    predicate: w => w.Id == widgetId,
    partition: w => w.TenantId == tenantId);

The following will throw at construction time:

  • Targeting a property that is not decorated with [EntityPartitionKey]
  • Targeting an entity that does not implement IRuntimePartitionStrategy
  • Supplying both partition and partitionValue simultaneously
  • Using a non-equality operator (e.g., w => w.TenantId != "x")
Cross-partition behavior

When no partition is specified, GetQueryPartitionValue() returns null, signalling the storage connector to perform a cross-partition scan. This is the default behavior — no special configuration is required.

// These are equivalent cross-partition queries:
var query = new EntityEnumerableQuery<Widget>(w => w.Price > 5.0m);
var query = new EntityEnumerableQuery<Widget>(predicate: w => w.Price > 5.0m);

Note: Cross-partition scans may incur higher cost on partitioned stores like Azure Cosmos DB. Prefer partition-scoped queries when the partition key is known.

Filtering

Expression-tree filters

The EntityFilter.Where<T>() method converts a lambda expression into an IFilter tree, resolving property names to entity field names via attribute metadata:

var filter = EntityFilter.Where<Widget>(w => w.Name == "Gadget" && w.Price > 10.0m);

Supported comparison operators: ==, !=, >, >=, <, <=

String method support

String instance methods are translated to the appropriate filter operator for each parser:

// Contains
var filter = EntityFilter.Where<Widget>(w => w.Name.Contains("Gadget"));
// OData:   contains(name,'Gadget')
// Gremlin: values('name').is(containing('Gadget'))
// MySQL:   name LIKE '%Gadget%'

// StartsWith
var filter = EntityFilter.Where<Widget>(w => w.Name.StartsWith("Wid"));

// EndsWith
var filter = EntityFilter.Where<Widget>(w => w.Name.EndsWith("get"));
Collection Contains (IN queries)

When a collection's Contains method is called with an entity property, it produces an IN filter:

var validCategories = new List<string> { "Electronics", "Tools" };
var filter = EntityFilter.Where<Product>(p => validCategories.Contains(p.Category));
// OData:   category in ('Electronics','Tools')
// Gremlin: values('category').is(within('Electronics','Tools'))
// MySQL:   category IN ('Electronics','Tools')

Filter builder

For more granular control, use EntityFilterBuilder<T> or FilterBuilder:

// Type-safe builder
var builder = new EntityFilterBuilder<Widget>();
builder.Add(w => w.Name, ComparisonOperator.Contains, "Gadget")
       .Add(LogicalOperator.And)
       .Add(w => w.Price, ComparisonOperator.GreaterThan, 10.0m);
var filter = builder.Build();

// String-based builder
var builder = new FilterBuilder();
builder.Add("name", ComparisonOperator.Contains, "Gadget")
       .Add(LogicalOperator.And)
       .Add("price", ComparisonOperator.GreaterThan, 10.0m);
var filter = builder.Build();

// Nested groups
var builder = new EntityFilterBuilder<Widget>();
builder.Add(w => w.Price, ComparisonOperator.GreaterThan, 5.0m)
       .Add(LogicalOperator.And)
       .Add(inner => inner
           .Add(w => w.Name, ComparisonOperator.StartsWith, "Wid")
           .Add(LogicalOperator.Or)
           .Add(w => w.Name, ComparisonOperator.EndsWith, "get"));
var filter = builder.Build();

Filter parser output

Filters are rendered to query-language strings via IFilterService<T>:

// Inject the appropriate filter service
IFilterService<ODataFilterConfiguration> odata = ...;
IFilterService<GremlinFilterConfiguration> gremlin = ...;
IFilterService<MySqlFilterConfiguration> mysql = ...;

var filter = EntityFilter.Where<Widget>(w => w.Name == "Gadget");

odata.GetFilterString(filter);   // "name eq 'Gadget'"
gremlin.GetFilterString(filter); // "values('name').is('Gadget')"
mysql.GetFilterString(filter);   // "name = 'Gadget'"

Authentication

Section to be expanded.

Cryptography

Section to be expanded.

Localization

Section to be expanded.

License

This project is dual-licensed by Sidub Inc.:

  1. GNU Affero General Public License v3 (AGPLv3) — see LICENSE-AGPLV3.txt
  2. Sidub Inc. Proprietary Software License Agreement (PSLA) — see LICENSE-PROPRIETARY.txt

You may choose to use, redistribute, and/or modify the product under the terms of either license. See LICENSE.txt for details or visit sidub.ca/licensing.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on Sidub.Platform.Authentication.IsolatedFunction:

Package Downloads
Sidub.Platform.Authorization.IsolatedFunction

Package Description

Sidub.Messaging.Host.SignalR

Sidub SignalR messaging framework.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.10.27 84 2/24/2026
1.10.25 107 2/24/2026
1.10.16 113 2/24/2026
1.10.15 117 2/23/2026
1.10.14 122 2/22/2026
1.10.13 128 2/21/2026
1.10.12 138 2/7/2026
1.10.11 140 2/5/2026
1.10.10 129 2/5/2026
1.10.9 140 2/4/2026
1.10.8 142 2/4/2026
1.10.7 128 2/2/2026
1.10.6 142 1/28/2026
1.10.2 138 1/28/2026
1.1.8 354 9/29/2024