Audit.SignalR
22.1.0
See the version list below for details.
dotnet add package Audit.SignalR --version 22.1.0
NuGet\Install-Package Audit.SignalR -Version 22.1.0
<PackageReference Include="Audit.SignalR" Version="22.1.0" />
paket add Audit.SignalR --version 22.1.0
#r "nuget: Audit.SignalR, 22.1.0"
// Install Audit.SignalR as a Cake Addin #addin nuget:?package=Audit.SignalR&version=22.1.0 // Install Audit.SignalR as a Cake Tool #tool nuget:?package=Audit.SignalR&version=22.1.0
Audit.SignalR
SignalR Auditing Extension for Audit.NET library.
Automatically generates Audit Logs for ASP.NET SignalR or Asp Net Core SignalR invokations.
Audit.SignalR provides a configurable Hub Pipeline Module/Filter that intercepts the hub processing to generate an audit trail.
It generate logs for the following events:
Event Name | Description | ASP.NET SignalR | ASP.NET Core SignalR |
---|---|---|---|
Connect | Client is connecting to the server | ✅ | ✅ |
Disconnect | Client disconnect from the server | ✅ | ✅ |
Incoming | Client invoking server-side method | ✅ | ✅ |
Reconnect | Client reconnecting to the server | ✅ | ❌ |
Outgoing | Server invoking client-side method | ✅ | ❌ |
Error | An error has occurred | ✅ | ❌ |
Install
NuGet Package
To install the package run the following command on the Package Manager Console:
PM> Install-Package Audit.SignalR
SignalR Version
This library supports:
Usage - ASP.NET SignalR
On your ASP.NET startup logic, call the extension method AddAuditModule()
defined on namespace Microsoft.AspNet.SignalR.GlobalHost.HubPipeline
, to setup the audit pipeline. This must be called before IAppBuilder.MapSignalR()
.
This method provides a fluent API to configure the audit module.
For example:
using Audit.SignalR;
using Microsoft.AspNet.SignalR;
//...
public class Startup
{
public void Configuration(IAppBuilder app)
{
GlobalHost.HubPipeline.AddAuditModule(config => config
.IncludeHeaders()
.Filters(f => f
.IncludeOutgoingEvent(og => og.HubName == "myHub")
.IncludeReconnectEvent(false));
app.MapSignalR();
}
}
This will create an AuditPipelineModule
(that inherits from HubPipelineModule)
and will add it to the hub pipeline.
Alternatively, you can create an instance of the module and add it to the pipeline, with the exact same effect:
using Audit.SignalR;
using Microsoft.AspNet.SignalR;
//...
var module = new AuditPipelineModule()
{
IncludeHeaders = true,
ReconnectEventsFilter = _ => false,
OutgoingEventsFilter = og => og.HubName == "myHub"
};
GlobalHost.HubPipeline.AddModule(module);
Or create the module using the factory method AuditPipelineModule.Create()
that provides the fluent API for the configuration:
var module = AuditPipelineModule.Create(config => config
.IncludeHeaders()
...
);
GlobalHost.HubPipeline.AddModule(module);
Usage - ASP.NET Core SignalR
On your ASP.NET Core startup logic, call the extension method AddAuditFilter()
defined on namespace Audit.SignalR
when adding the SignalR service.
This method provides a fluent API to configure the audit filter.
For example:
using Audit.SignalR;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSignalR(c =>
{
c.AddAuditFilter(cfg => cfg
.IncludeHeaders()
.IncludeQueryString()
.Filters(f => f
.IncludeIncomingEvent(true)
.IncludeConnectEvent(false)
.IncludeDisconnectEvent(false))
);
});
This will create an Audit HubFilter
and add it to the hub pipeline.
Configuration
Settings
The following settings can be configured on the module/filter:
- AuditEventType: To indicate the event type to use on the audit event. (Default is the event name). Can contain the following placeholders:
- {event}: replaced with the SignalR event name (Connect, Reconnect, Disconnect, Incoming, Outgoing, Error).
- IncludeHeaders: To indicate if the audit should include the request headers (Valid for events Connect, Reconnect, Disconnect, Incoming and Error). Default is false.
- IncludeQueryString: To indicate if the audit should include the request Query String (Valid for events Connect, Reconnect, Disconnect, Incoming and Error). Default is false.
- AuditDisabled: Set to true to disable the audit log generation (bypass). Default is false.
- CreationPolicy: To indicate the event creation policy to use. Default is NULL to use the globally configured creation policy.
- AuditDataProvider: To indicate the Audit Data Provider to use. Default is NULL to use the globally configured data provider.
Filter settings
The module allows to configure filtering of events. By default it will log all the events.
- IncomingEventsFilter: Allows to filter Incoming events (invoking server-side methods) with a custom function that given the incoming event info, returns true if the event should be logged and false otherwise.
- OutgoingEventsFilter: Allows to filter Outgoing events (invoking client-side methods).
- ConnectEventsFilter: Allows to filter Connect events.
- DisconnectEventsFilter: Allows to filter Disconnect events.
- ReconnectEventsFilter: Allows to filter Reconnect events.
- ErrorEventsFilter: Allows to filter Error events.
Extension Methods
You can access the current Audit Scope
for the incoming event inside server-side methods, by calling the Hub extension method GetIncomingAuditScope()
/ GetAuditScope()
,
for example:
public class MyHub : Hub
{
public int Send(string name, string message)
{
var scope = this.GetAuditScope();
if (someCondition)
{
scope.Discard()
}
else
{
scope.SetCustomField("UserType", user.UserType);
}
//...
}
The SignalR specific event information on the AuditScope can be accessed as follows:
var scope = this.GetIncomingAuditScope();
var signalrEventIncoming = scope.Event.GetSignalrEvent<SignalrEventIncoming>();
Event Output
To configure the output persistence mechanism please see Configuration and Data Providers sections.
Output
Audit.SignalR output includes:
- Execution time and duration (when applicable)
- Environment information such as user, machine, domain and locale.
- ConnectionId
- Hub name, Method name and Arguments
- Exception details
- HTTP request details (optional)
Output details
The following tables describes the Audit.SignalR output fields per event type:
Field Name | Type | Description |
---|---|---|
EventType | SignalrEventType | "Connect" |
ConnectionId | string | The connection ID |
Headers | Dictionary<string, string> | The HTTP headers of the associated request (when IncludeHeaders is set to true) |
QueryString | Dictionary<string, string> | The query string of the associated request (when IncludeQueryString is set to true) |
LocalPath | string | The local path |
IdentityName | string | The identity name associated |
Field Name | Type | Description |
---|---|---|
EventType | SignalrEventType | "Disconnect" |
ConnectionId | string | The connection ID |
Headers | Dictionary<string, string> | The HTTP headers of the associated request (when IncludeHeaders is set to true) |
QueryString | Dictionary<string, string> | The query string of the associated request (when IncludeQueryString is set to true) |
LocalPath | string | The local path |
IdentityName | string | The identity name associated |
StopCalled | boolean | Set to true if the client explicitly closed the connection |
Field Name | Type | Description |
---|---|---|
EventType | SignalrEventType | "Incoming" |
ConnectionId | string | The connection ID |
Headers | Dictionary<string, string> | The HTTP headers of the associated request (when IncludeHeaders is set to true) |
QueryString | Dictionary<string, string> | The query string of the associated request (when IncludeQueryString is set to true) |
LocalPath | string | The local path |
IdentityName | string | The identity name associated |
HubName | string | The hub name |
HubType | string | The hub type name |
MethodName | string | The name of the invoked method |
Args | List<Object> | The arguments passed in the invokation |
Result | Object | The invoked method return value |
Exception | string | Exception information when the hub method fails |
Field Name | Type | Description |
---|---|---|
EventType | SignalrEventType | "Outgoing" |
HubName | string | The hub name |
Signal | string | The signal (ConnectionId, hub type name or hub type name + "." + group name) belonging to clients that receive the method invocation |
MethodName | string | The invoked method name |
Args | List<Object> | The arguments passed in the invokation |
SignalrEventError : SignalrEventConnect
Field Name | Type | Description |
---|---|---|
EventType | SignalrEventType | "Error" |
ConnectionId | string | The connection ID |
Headers | Dictionary<string, string> | The HTTP headers of the associated request (when IncludeHeaders is set to true) |
QueryString | Dictionary<string, string> | The query string of the associated request (when IncludeQueryString is set to true) |
LocalPath | string | The local path |
IdentityName | string | The identity name associated |
HubName | string | The hub name |
HubType | string | The hub type name |
Exception | string | Detailed information about the exception |
MethodName | string | The name of the invoked method |
Args | List<Object> | The arguments passed in the invokation |
Customization
Custom fields
You can add extra information as custom fields to the events by calling the method AddAuditCustomField
on your Hub
. For example:
public class MyHub : Hub
{
public int Send(string name, string message)
{
this.AddCustomField("User", user);
}
Another way to customize the output is by using global custom actions, please see custom actions for more information.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net7.0 is compatible. 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. |
.NET Framework | net45 is compatible. net451 was computed. net452 was computed. net46 was computed. net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
-
.NETFramework 4.5
- Audit.NET (>= 22.1.0)
- Microsoft.AspNet.SignalR.Core (>= 2.1.2)
- Newtonsoft.Json (>= 13.0.1)
-
net7.0
- Audit.NET (>= 22.1.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
27.1.1 | 801 | 10/28/2024 |
27.1.0 | 177 | 10/24/2024 |
27.0.3 | 1,266 | 9/25/2024 |
27.0.2 | 150 | 9/19/2024 |
27.0.1 | 507 | 9/4/2024 |
27.0.0 | 749 | 9/3/2024 |
26.0.1 | 376 | 8/22/2024 |
26.0.0 | 1,623 | 7/19/2024 |
25.0.7 | 997 | 7/4/2024 |
25.0.6 | 102 | 6/24/2024 |
25.0.5 | 109 | 6/18/2024 |
25.0.4 | 2,717 | 3/24/2024 |
25.0.3 | 151 | 3/13/2024 |
25.0.2 | 129 | 3/12/2024 |
25.0.1 | 142 | 2/28/2024 |
25.0.0 | 129 | 2/16/2024 |
24.0.1 | 139 | 2/12/2024 |
24.0.0 | 120 | 2/12/2024 |
23.0.0 | 3,534 | 12/14/2023 |
22.1.0 | 114 | 12/9/2023 |
22.0.2 | 1,567 | 12/1/2023 |
22.0.1 | 150 | 11/16/2023 |
22.0.0 | 118 | 11/14/2023 |
21.1.0 | 1,140 | 10/9/2023 |
21.0.4 | 1,313 | 9/15/2023 |
21.0.3 | 2,776 | 7/9/2023 |
21.0.2 | 176 | 7/6/2023 |
21.0.1 | 172 | 5/27/2023 |
21.0.0 | 914 | 4/15/2023 |
20.2.4 | 515 | 3/27/2023 |
20.2.3 | 425 | 3/17/2023 |
20.2.2 | 245 | 3/14/2023 |
20.2.1 | 235 | 3/11/2023 |
20.2.0 | 239 | 3/7/2023 |
20.1.6 | 270 | 2/23/2023 |
20.1.5 | 296 | 2/9/2023 |
20.1.4 | 346 | 1/28/2023 |
20.1.3 | 337 | 12/21/2022 |
20.1.2 | 329 | 12/14/2022 |
20.1.1 | 316 | 12/12/2022 |
20.1.0 | 349 | 12/4/2022 |
20.0.4 | 364 | 11/30/2022 |
20.0.3 | 681 | 10/28/2022 |
20.0.2 | 444 | 10/26/2022 |
20.0.1 | 490 | 10/21/2022 |
20.0.0 | 589 | 10/1/2022 |
19.4.1 | 566 | 9/10/2022 |
19.4.0 | 494 | 9/2/2022 |
19.3.0 | 505 | 8/23/2022 |
19.2.2 | 557 | 8/11/2022 |
19.2.1 | 523 | 8/6/2022 |
19.2.0 | 594 | 7/24/2022 |
19.1.4 | 517 | 5/23/2022 |
19.1.3 | 494 | 5/22/2022 |
19.1.2 | 471 | 5/18/2022 |
19.1.1 | 510 | 4/28/2022 |
19.1.0 | 504 | 4/10/2022 |
19.0.7 | 516 | 3/13/2022 |
19.0.6 | 547 | 3/7/2022 |
19.0.5 | 558 | 1/28/2022 |
19.0.4 | 537 | 1/23/2022 |
19.0.3 | 386 | 12/14/2021 |
19.0.2 | 372 | 12/11/2021 |
19.0.1 | 738 | 11/20/2021 |
19.0.0 | 381 | 11/11/2021 |
19.0.0-rc.net60.2 | 156 | 9/26/2021 |
19.0.0-rc.net60.1 | 203 | 9/16/2021 |
18.1.6 | 446 | 9/26/2021 |
18.1.5 | 417 | 9/7/2021 |
18.1.4 | 414 | 9/6/2021 |
18.1.3 | 2,904 | 8/19/2021 |
18.1.2 | 516 | 8/8/2021 |
18.1.1 | 439 | 8/5/2021 |
18.1.0 | 485 | 8/1/2021 |
18.0.1 | 485 | 7/30/2021 |
18.0.0 | 504 | 7/26/2021 |
17.0.8 | 462 | 7/7/2021 |
17.0.7 | 504 | 6/16/2021 |
17.0.6 | 466 | 6/5/2021 |
17.0.5 | 489 | 5/28/2021 |
17.0.4 | 473 | 5/4/2021 |
17.0.3 | 451 | 5/1/2021 |
17.0.2 | 471 | 4/22/2021 |
17.0.1 | 453 | 4/18/2021 |
17.0.0 | 511 | 3/26/2021 |
16.5.6 | 502 | 3/25/2021 |
16.5.5 | 446 | 3/23/2021 |
16.5.4 | 498 | 3/9/2021 |
16.5.3 | 466 | 2/26/2021 |
16.5.2 | 537 | 2/23/2021 |
16.5.1 | 475 | 2/21/2021 |
16.5.0 | 460 | 2/17/2021 |
16.4.5 | 463 | 2/15/2021 |
16.4.4 | 458 | 2/5/2021 |
16.4.3 | 460 | 1/27/2021 |
16.4.2 | 477 | 1/22/2021 |
16.4.1 | 519 | 1/21/2021 |
16.4.0 | 502 | 1/11/2021 |
16.3.3 | 511 | 1/8/2021 |
16.3.2 | 505 | 1/3/2021 |
16.3.1 | 525 | 12/31/2020 |
16.3.0 | 455 | 12/30/2020 |
16.2.1 | 500 | 12/27/2020 |
16.2.0 | 568 | 10/13/2020 |
16.1.5 | 570 | 10/4/2020 |
16.1.4 | 582 | 9/17/2020 |
16.1.3 | 688 | 9/13/2020 |
16.1.2 | 558 | 9/9/2020 |
16.1.1 | 578 | 9/3/2020 |
16.1.0 | 595 | 8/19/2020 |
16.0.3 | 625 | 8/15/2020 |
16.0.2 | 587 | 8/9/2020 |
16.0.1 | 671 | 8/8/2020 |
16.0.0 | 564 | 8/7/2020 |
15.3.0 | 632 | 7/23/2020 |
15.2.3 | 598 | 7/14/2020 |
15.2.2 | 1,022 | 5/19/2020 |
15.2.1 | 579 | 5/12/2020 |
15.2.0 | 619 | 5/9/2020 |
15.1.1 | 584 | 5/4/2020 |
15.1.0 | 629 | 4/13/2020 |
15.0.5 | 632 | 3/18/2020 |
15.0.4 | 597 | 2/28/2020 |
15.0.3 | 585 | 2/26/2020 |
15.0.2 | 775 | 1/20/2020 |
15.0.1 | 644 | 1/10/2020 |
15.0.0 | 637 | 12/17/2019 |
14.9.1 | 644 | 11/30/2019 |
14.9.0 | 630 | 11/29/2019 |
14.8.1 | 642 | 11/26/2019 |
14.8.0 | 635 | 11/20/2019 |
14.7.0 | 658 | 10/9/2019 |
14.6.6 | 655 | 10/8/2019 |
14.6.5 | 649 | 9/27/2019 |
14.6.4 | 650 | 9/21/2019 |
14.6.3 | 672 | 8/12/2019 |
14.6.2 | 712 | 8/3/2019 |
14.6.1 | 686 | 8/3/2019 |
14.6.0 | 658 | 7/26/2019 |
14.5.7 | 695 | 7/18/2019 |
14.5.6 | 691 | 7/10/2019 |
14.5.5 | 689 | 7/1/2019 |
14.5.4 | 694 | 6/17/2019 |
14.5.3 | 718 | 6/5/2019 |
14.5.2 | 696 | 5/30/2019 |
14.5.1 | 690 | 5/28/2019 |
14.5.0 | 709 | 5/24/2019 |
14.4.0 | 729 | 5/22/2019 |
14.3.4 | 742 | 5/14/2019 |
14.3.3 | 695 | 5/9/2019 |
14.3.2 | 741 | 4/30/2019 |
14.3.1 | 730 | 4/27/2019 |
14.3.0 | 754 | 4/24/2019 |
14.2.3 | 747 | 4/17/2019 |
14.2.2 | 717 | 4/10/2019 |
14.2.1 | 705 | 4/5/2019 |
14.2.0 | 711 | 3/16/2019 |
14.1.1 | 711 | 3/8/2019 |
14.1.0 | 819 | 2/11/2019 |
14.0.4 | 801 | 1/31/2019 |
14.0.3 | 827 | 1/22/2019 |
14.0.2 | 844 | 12/15/2018 |
14.0.1 | 863 | 11/29/2018 |
14.0.0 | 886 | 11/19/2018 |
13.3.0 | 897 | 11/16/2018 |
13.2.2 | 872 | 11/15/2018 |
13.2.1 | 874 | 11/13/2018 |
13.2.0 | 898 | 10/31/2018 |
13.1.5 | 888 | 10/31/2018 |
13.1.4 | 912 | 10/25/2018 |
13.1.3 | 901 | 10/18/2018 |
13.1.2 | 956 | 9/12/2018 |
13.1.1 | 955 | 9/11/2018 |
13.1.0 | 971 | 9/11/2018 |
13.0.0 | 982 | 8/29/2018 |
12.3.6 | 965 | 8/29/2018 |
12.3.5 | 979 | 8/22/2018 |
12.3.4 | 983 | 8/21/2018 |
12.3.3 | 25,739 | 8/21/2018 |
12.3.2 | 1,041 | 8/20/2018 |
12.3.1 | 1,053 | 8/20/2018 |
12.3.0 | 1,008 | 8/20/2018 |
12.2.2 | 1,041 | 8/15/2018 |
12.2.1 | 1,089 | 8/9/2018 |
12.2.0 | 1,015 | 8/8/2018 |
12.1.11 | 1,022 | 7/30/2018 |
12.1.10 | 978 | 7/20/2018 |
12.1.9 | 1,110 | 7/10/2018 |
12.1.8 | 1,140 | 7/2/2018 |
12.1.7 | 1,168 | 6/7/2018 |
12.1.6 | 1,054 | 6/4/2018 |
12.1.5 | 1,096 | 6/2/2018 |
12.1.4 | 1,044 | 5/25/2018 |
12.1.3 | 1,229 | 5/16/2018 |
12.1.2 | 1,096 | 5/15/2018 |
12.1.1 | 1,187 | 5/14/2018 |
12.1.0 | 1,119 | 5/9/2018 |
12.0.7 | 1,451 | 5/5/2018 |
12.0.6 | 1,190 | 5/4/2018 |
12.0.5 | 1,153 | 5/3/2018 |
12.0.4 | 1,228 | 4/30/2018 |
12.0.3 | 1,202 | 4/30/2018 |
12.0.2 | 1,117 | 4/27/2018 |
12.0.1 | 1,111 | 4/25/2018 |
12.0.0 | 1,054 | 4/22/2018 |
11.2.0 | 1,195 | 4/11/2018 |
11.1.0 | 1,118 | 4/8/2018 |
11.0.8 | 1,129 | 3/26/2018 |
11.0.7 | 1,114 | 3/20/2018 |
11.0.6 | 1,130 | 3/7/2018 |
11.0.5 | 1,074 | 2/22/2018 |
11.0.4 | 1,130 | 2/14/2018 |
11.0.3 | 1,164 | 2/12/2018 |
11.0.2 | 1,143 | 2/9/2018 |
11.0.1 | 1,065 | 1/29/2018 |
11.0.0 | 1,157 | 1/15/2018 |
10.0.3 | 1,079 | 12/29/2017 |
10.0.2 | 1,151 | 12/26/2017 |
10.0.1 | 1,229 | 12/18/2017 |
10.0.0 | 1,040 | 12/18/2017 |
9.3.0 | 1,177 | 12/17/2017 |
9.2.0 | 1,162 | 12/17/2017 |