Skip to content

Commit fbf3b1a

Browse files
committed
Add authorization filter.
1 parent 5588e8c commit fbf3b1a

File tree

10 files changed

+114
-34
lines changed

10 files changed

+114
-34
lines changed

src/SampleWebApplication/Startup.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ public void ConfigureServices(IServiceCollection services)
3131
{
3232
var mvcBuilder = services.AddControllersWithViews();
3333

34-
services.AddSerilogUi(mvcBuilder, options =>
35-
options.UseSqlServer("Server=.;Database=SerilogWebUi;Integrated Security=True;", "Logs"));
34+
services.AddSerilogUi(mvcBuilder, options => options
35+
.EnableAuthorization(authOptions => authOptions.Usernames = new[] { "Test" })
36+
.UseSqlServer("Server=.;Database=SerilogWebUi;Integrated Security=True;", "Logs")
37+
);
3638
}
3739

3840
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

src/Serilog.Ui.Core/OptionsBuilder/DataProviderOptionsBuilder.cs

Lines changed: 0 additions & 16 deletions
This file was deleted.

src/Serilog.Ui.Core/OptionsBuilder/IDataProviderOptionsBuilder.cs renamed to src/Serilog.Ui.Core/OptionsBuilder/ISerilogUiOptionsBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Serilog.Ui.Core
44
{
5-
public interface IDataProviderOptionsBuilder
5+
public interface ISerilogUiOptionsBuilder
66
{
77
IServiceCollection Services { get; }
88
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
3+
namespace Serilog.Ui.Core
4+
{
5+
public class SerilogUiOptionsBuilder : ISerilogUiOptionsBuilder
6+
{
7+
private readonly IServiceCollection _services;
8+
9+
public SerilogUiOptionsBuilder(IServiceCollection services)
10+
{
11+
_services = services;
12+
}
13+
14+
IServiceCollection ISerilogUiOptionsBuilder.Services => _services;
15+
}
16+
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace Serilog.Ui.MsSqlServerProvider
77
public static class DataProviderOptionBuilderExtensions
88
{
99
public static void UseSqlServer(
10-
this DataProviderOptionsBuilder optionsBuilder,
10+
this SerilogUiOptionsBuilder optionsBuilder,
1111
string connectionString,
1212
string tableName,
1313
string schemaName = "dbo"
@@ -26,8 +26,8 @@ public static void UseSqlServer(
2626
Schema = schemaName
2727
};
2828

29-
((IDataProviderOptionsBuilder)optionsBuilder).Services.AddSingleton(relationProvider);
30-
((IDataProviderOptionsBuilder)optionsBuilder).Services.AddScoped<IDataProvider, SqlServerDataProvider>();
29+
((ISerilogUiOptionsBuilder)optionsBuilder).Services.AddSingleton(relationProvider);
30+
((ISerilogUiOptionsBuilder)optionsBuilder).Services.AddScoped<IDataProvider, SqlServerDataProvider>();
3131
}
3232
}
3333
}

src/Serilog.Ui.Web/Controllers/LogsController.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.AspNetCore.Mvc;
22
using Microsoft.AspNetCore.Mvc.Rendering;
33
using Serilog.Ui.Core;
4+
using Serilog.Ui.Web.Filters;
45
using Serilog.Ui.Web.ViewModel;
56
using System.Collections.Generic;
67
using System.IO;
@@ -10,6 +11,7 @@
1011

1112
namespace Serilog.Ui.Web.Controllers
1213
{
14+
[ServiceFilter(typeof(AuthorizationFilter))]
1315
public class LogsController : Controller
1416
{
1517
private static readonly string Scripts;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System.Collections.Generic;
2+
3+
namespace Serilog.Ui.Web
4+
{
5+
public class AuthorizationOptions
6+
{
7+
public IEnumerable<string> Usernames { get; set; }
8+
9+
public IEnumerable<string> Roles { get; set; }
10+
11+
internal bool Enabled { get; set; } = false;
12+
}
13+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using Serilog.Ui.Core;
3+
using System;
4+
5+
namespace Serilog.Ui.Web
6+
{
7+
public static class SerilogUiOptionBuilderExtensions
8+
{
9+
public static SerilogUiOptionsBuilder EnableAuthorization(this SerilogUiOptionsBuilder optionsBuilder, Action<AuthorizationOptions> options)
10+
{
11+
if (optionsBuilder == null)
12+
throw new ArgumentNullException(nameof(optionsBuilder));
13+
14+
if (options == null)
15+
throw new ArgumentNullException(nameof(options));
16+
17+
var authorizationOptions = new AuthorizationOptions { Enabled = true };
18+
options.Invoke(authorizationOptions);
19+
20+
((ISerilogUiOptionsBuilder)optionsBuilder).Services.AddSingleton<AuthorizationOptions>(authorizationOptions);
21+
22+
return optionsBuilder;
23+
}
24+
}
25+
}
Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.AspNetCore.Mvc.ApplicationParts;
22
using Microsoft.Extensions.DependencyInjection;
33
using Serilog.Ui.Core;
4+
using Serilog.Ui.Web.Filters;
45
using System;
56
using System.Linq;
67

@@ -11,22 +12,18 @@ public static class ServiceCollectionExtensions
1112
public static IServiceCollection AddSerilogUi(
1213
this IServiceCollection services,
1314
IMvcBuilder mvcBuilder,
14-
Action<DataProviderOptionsBuilder> optionsBuilder)
15+
Action<SerilogUiOptionsBuilder> optionsBuilder
16+
)
1517
{
1618
if (services == null)
1719
throw new ArgumentNullException(nameof(services));
1820

1921
if (optionsBuilder == null)
2022
throw new ArgumentNullException(nameof(optionsBuilder));
2123

22-
var builder = new DataProviderOptionsBuilder(services);
24+
var builder = new SerilogUiOptionsBuilder(services);
2325
optionsBuilder.Invoke(builder);
2426

25-
//var assembly = typeof(ServiceCollectionExtensions).Assembly;
26-
// var location = assembly.Location;
27-
//var embeddedFileProvider = new EmbeddedFileProvider(assembly);
28-
//mvcBuilder.AddRazorRuntimeCompilation(options => options.FileProviders.Add(embeddedFileProvider));
29-
3027
var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(a => a.FullName.StartsWith("Serilog.Ui.Web")).ToList();
3128
foreach (var assembly in assemblies)
3229
{
@@ -39,12 +36,13 @@ public static IServiceCollection AddSerilogUi(
3936
}
4037
}
4138

42-
return services;
43-
}
39+
var isAuthorizationFilterExist = services.Any(s => s.ServiceType.FullName == typeof(AuthorizationOptions).FullName);
40+
if (!isAuthorizationFilterExist)
41+
services.AddScoped<AuthorizationOptions>();
4442

45-
private static void ConfigureApplicationParts(ApplicationPartManager apm)
46-
{
47-
apm.ApplicationParts.Add(new AssemblyPart(typeof(ServiceCollectionExtensions).Assembly));
43+
services.AddScoped<AuthorizationFilter>();
44+
45+
return services;
4846
}
4947
}
5048
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using Microsoft.AspNetCore.Mvc;
2+
using Microsoft.AspNetCore.Mvc.Filters;
3+
using System.Linq;
4+
5+
namespace Serilog.Ui.Web.Filters
6+
{
7+
internal class AuthorizationFilter : IAuthorizationFilter
8+
{
9+
private readonly AuthorizationOptions _authorizationOptions;
10+
11+
public AuthorizationFilter(AuthorizationOptions authorizationOptions)
12+
{
13+
_authorizationOptions = authorizationOptions;
14+
}
15+
16+
public void OnAuthorization(AuthorizationFilterContext context)
17+
{
18+
if (!_authorizationOptions.Enabled)
19+
return;
20+
21+
if (!context.HttpContext.User.Identity.IsAuthenticated)
22+
{
23+
context.Result = new UnauthorizedResult();
24+
return;
25+
}
26+
27+
var userName = context.HttpContext.User.Identity.Name.ToLower();
28+
29+
if (_authorizationOptions.Usernames != null &&
30+
_authorizationOptions.Usernames.Any(u => u.ToLower() == userName))
31+
return;
32+
33+
if (_authorizationOptions.Roles != null &&
34+
_authorizationOptions.Roles.Any(role => context.HttpContext.User.IsInRole(role)))
35+
return;
36+
37+
context.Result = new ForbidResult();
38+
}
39+
}
40+
}

0 commit comments

Comments
 (0)