Skip to content

Commit ebca4fe

Browse files
committed
Permission for ReadWrite
1 parent 016ed55 commit ebca4fe

File tree

3 files changed

+105
-2
lines changed

3 files changed

+105
-2
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
namespace LearningHub.NHS.OpenAPI.Authentication
2+
{
3+
using System.Threading.Tasks;
4+
using Microsoft.AspNetCore.Authorization;
5+
using Microsoft.AspNetCore.Http;
6+
7+
/// <summary>
8+
/// Provide Authentication policy for Auth Service.
9+
/// </summary>
10+
public class ReadWriteHandler : AuthorizationHandler<ReadWriteRequirement>
11+
{
12+
/// <summary>
13+
/// The context accessor.
14+
/// </summary>
15+
private readonly IHttpContextAccessor contextAccessor;
16+
17+
/// <summary>
18+
/// Initializes a new instance of the <see cref="ReadWriteHandler"/> class.
19+
/// Provide Authentication policy for Auth Service.
20+
/// </summary>
21+
/// <param name="contextAccessor">The context Accessor.</param>
22+
public ReadWriteHandler(IHttpContextAccessor contextAccessor)
23+
{
24+
this.contextAccessor = contextAccessor;
25+
}
26+
27+
/// <summary>
28+
/// Handle Authentication policy Requirement.
29+
/// </summary>
30+
/// <param name="context">The context.</param>
31+
/// <param name="requirement">The requirement.</param>
32+
/// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
33+
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ReadWriteRequirement requirement)
34+
{
35+
if (requirement.HasReadWriteRole(context.User))
36+
{
37+
context.Succeed(requirement);
38+
}
39+
40+
return Task.CompletedTask;
41+
}
42+
}
43+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
namespace LearningHub.NHS.OpenAPI.Authentication
2+
{
3+
using System.Collections.Generic;
4+
using System.Security.Claims;
5+
6+
using Microsoft.AspNetCore.Authorization;
7+
8+
/// <summary>
9+
/// Provide Authentication policy for Auth Service.
10+
/// </summary>
11+
public class ReadWriteRequirement : IAuthorizationRequirement
12+
{
13+
/// <summary>
14+
/// Initializes a new instance of the <see cref="ReadWriteRequirement"/> class.
15+
/// Provide Authentication policy for Auth Service.
16+
/// </summary>
17+
public ReadWriteRequirement()
18+
{
19+
}
20+
21+
/// <summary>
22+
/// The can read write.
23+
/// </summary>
24+
/// <param name="user">The user.</param>
25+
/// <returns>The <see cref="bool"/>.</returns>
26+
public bool HasReadWriteRole(ClaimsPrincipal user)
27+
{
28+
bool retVal = false;
29+
foreach (var role in ReadWriteRoles())
30+
{
31+
if (user.IsInRole(role))
32+
{
33+
retVal = true;
34+
break;
35+
}
36+
}
37+
38+
return retVal;
39+
}
40+
41+
/// <summary>
42+
/// The read write roles.
43+
/// </summary>
44+
/// <returns>The Read Write Roles.</returns>
45+
private List<string> ReadWriteRoles() => new List<string>() { "Administrator", "BlueUser" };
46+
}
47+
}

OpenAPI/LearningHub.Nhs.OpenApi/Startup.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ namespace LearningHub.NHS.OpenAPI
2929
using Microsoft.Extensions.Hosting;
3030
using Microsoft.IdentityModel.Tokens;
3131
using Microsoft.OpenApi.Models;
32+
using Microsoft.AspNetCore.Authorization;
33+
using LearningHub.NHS.OpenAPI.Authentication;
3234

3335
/// <summary>
3436
/// The Startup class.
@@ -73,6 +75,7 @@ public void ConfigureServices(IServiceCollection services)
7375
});
7476

7577
services.AddCustomMiddleware();
78+
services.AddSingleton<IAuthorizationHandler, ReadWriteHandler>();
7679

7780
services.AddRepositories(this.Configuration);
7881
services.AddServices();
@@ -81,8 +84,11 @@ public void ConfigureServices(IServiceCollection services)
8184
options =>
8285
options.UseSqlServer(this.Configuration.GetConnectionString("LearningHub")));
8386
services.AddApplicationInsightsTelemetry();
84-
services.AddControllers(options => options.Filters.Add(new HttpResponseExceptionFilter()));
85-
services.AddControllers(opt => { opt.Filters.Add(new AuthorizeFilter()); })
87+
services.AddControllers(options =>
88+
{
89+
options.Filters.Add(new HttpResponseExceptionFilter());
90+
options.Filters.Add(new AuthorizeFilter());
91+
})
8692
.AddJsonOptions(options =>
8793
{
8894
options.JsonSerializerOptions.ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles;
@@ -147,6 +153,13 @@ public void ConfigureServices(IServiceCollection services)
147153
});
148154
});
149155

156+
services.AddAuthorization(options =>
157+
{
158+
options.AddPolicy(
159+
"ReadWrite",
160+
policy => policy.Requirements.Add(new ReadWriteRequirement()));
161+
});
162+
150163
var environment = this.Configuration.GetValue<EnvironmentEnum>("Environment");
151164
var envPrefix = environment.GetAbbreviation();
152165
if (environment == EnvironmentEnum.Local)

0 commit comments

Comments
 (0)