Skip to content

SharedSignalsEndpointRouteBuilderExtensions Class

Maps the Shared Signals endpoints as Minimal API route handlers: the whole transmitter management surface in one call, its configuration document in another. The handlers translate transport to the host-agnostic services and nothing else - authentication is the host's middleware, and the receiver identity is read per SharedSignalsEndpointOptions.

Push delivery is not here. RFC 8935 carries any Security Event Token, not this framework's in particular, so its intake belongs to the package that owns the token - a receiver maps it with MapPushDeliveryEndpoint from Abblix.SecurityEvents.MinimalApi.

C#
public static class SharedSignalsEndpointRouteBuilderExtensions

Inheritance System.Object → SharedSignalsEndpointRouteBuilderExtensions

Methods

SharedSignalsEndpointRouteBuilderExtensions.MapSharedSignalsConfigurationDocument(this IEndpointRouteBuilder) Method

Maps the transmitter's configuration document (SSF 1.0 Section 7.2) on its own: at ConfigurationDocumentRoute, or at the well-known address the issuer resolves to when that option is null.

C#
public static Microsoft.AspNetCore.Builder.IEndpointConventionBuilder MapSharedSignalsConfigurationDocument(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints);

Parameters

endpoints Microsoft.AspNetCore.Routing.IEndpointRouteBuilder

The route builder.

Returns

Microsoft.AspNetCore.Builder.IEndpointConventionBuilder

Remarks

MapSharedSignalsTransmitterEndpoints(this IEndpointRouteBuilder) calls this by default, so a plain host never needs it. It exists for the deployment where the canonical address is answered by something in front of the application: a gateway or CDN serving a cached copy (set MapWellKnownConfiguration to false and do not call this), or a reverse proxy rewriting paths, where the document must exist on an internal route the proxy maps the canonical address onto. The document advertises AdvertisedPrefix - the prefix as the outside world reaches it. The EXTERNAL address never moves: receivers derive it from the issuer, not from configuration, so the route option is deployment plumbing, not a protocol choice.

SharedSignalsEndpointRouteBuilderExtensions.MapSharedSignalsTransmitterEndpoints(this IEndpointRouteBuilder) Method

Maps the transmitter's endpoints: the Event Stream Management API under ManagementPrefix, poll delivery beside it, and the configuration document at the well-known address the issuer resolves to (SSF 1.0 Section 7.2). Every route comes from SharedSignalsEndpointOptions, so one options object states the whole topology.

C#
public static Microsoft.AspNetCore.Routing.RouteGroupBuilder MapSharedSignalsTransmitterEndpoints(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints);

Parameters

endpoints Microsoft.AspNetCore.Routing.IEndpointRouteBuilder

The route builder.

Returns

Microsoft.AspNetCore.Routing.RouteGroupBuilder

Remarks

The returned group carries the management and poll endpoints - attach the host's authorization to it. The well-known endpoint is deliberately mapped OUTSIDE the group: discovery must answer before any receiver has credentials, so the group's authorization does not cover it.

A route the HOST adds to this group is not scope-checked, and that is worth knowing before adding one. The filter is attached to the GROUP, so it is in that route's pipeline - but it judges a route by the requirement the route declares, and only the routes mapped here declare one. A route with none is let through. So a host route beside them is admitted for any caller the host's own authorization admits, in a deployment where every neighbouring route answers 403 to that same caller.

The scope requirement is deliberately not something a host can declare: making it so would put the metadata type into this package's public surface for a need nobody has stated. The scopes themselves are already public - SsfScopes carries their names and the profile's inclusion rule - so a host that wants its route scoped reads the granted scopes and asks SsfScopes.Satisfies, rather than needing a requirement this package would then have to honour forever.