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
<PackageReference Include="Sidub.Platform.Authentication.IsolatedFunction" Version="1.10.27" />
<PackageVersion Include="Sidub.Platform.Authentication.IsolatedFunction" Version="1.10.27" />
<PackageReference Include="Sidub.Platform.Authentication.IsolatedFunction" />
paket add Sidub.Platform.Authentication.IsolatedFunction --version 1.10.27
#r "nuget: Sidub.Platform.Authentication.IsolatedFunction, 1.10.27"
#:package Sidub.Platform.Authentication.IsolatedFunction@1.10.27
#addin nuget:?package=Sidub.Platform.Authentication.IsolatedFunction&version=1.10.27
#tool nuget:?package=Sidub.Platform.Authentication.IsolatedFunction&version=1.10.27
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
partitionandpartitionValuesimultaneously - 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.:
- GNU Affero General Public License v3 (AGPLv3) — see LICENSE-AGPLV3.txt
- 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 | Versions 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. |
-
.NETStandard 2.0
- Microsoft.Azure.Functions.Worker.Core (>= 2.51.0)
- Microsoft.IdentityModel.Protocols.OpenIdConnect (>= 8.16.0)
- Sidub.Platform.Authentication (>= 1.10.27)
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 |