Skip to content

Commit 98e42a1

Browse files
committed
Add dynamic authorization test class.
1 parent ebc8926 commit 98e42a1

File tree

8 files changed

+138
-53
lines changed

8 files changed

+138
-53
lines changed

src/DynamicAuthorization.Mvc.Core/Filters/DynamicAuthorizationFilter.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ private static bool IsProtectedAction(AuthorizationFilterContext context)
9898

9999
#else
100100

101-
private bool IsProtectedAction(AuthorizationFilterContext context)
101+
private static bool IsProtectedAction(AuthorizationFilterContext context)
102102
{
103103
if (context.Filters.Any(item => item is IAllowAnonymousFilter))
104104
return false;
@@ -123,12 +123,12 @@ private bool IsProtectedAction(AuthorizationFilterContext context)
123123

124124
#endif
125125

126-
private bool IsUserAuthenticated(AuthorizationFilterContext context)
126+
private static bool IsUserAuthenticated(AuthorizationFilterContext context)
127127
{
128128
return context.HttpContext.User.Identity.IsAuthenticated;
129129
}
130130

131-
private string GetActionId(AuthorizationFilterContext context)
131+
private static string GetActionId(AuthorizationFilterContext context)
132132
{
133133
var controllerActionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor;
134134
var area = controllerActionDescriptor.ControllerTypeInfo.GetCustomAttribute<AreaAttribute>()?.RouteValue;
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using Microsoft.AspNetCore.Identity;
2+
using Microsoft.AspNetCore.Mvc;
3+
using System.Threading.Tasks;
4+
5+
namespace DynamicRoleBasedAuthorization.Tests.Controllers
6+
{
7+
public class UserController : Controller
8+
{
9+
private readonly SignInManager<IdentityUser> _signInManager;
10+
private readonly UserManager<IdentityUser> _userManager;
11+
12+
public UserController(SignInManager<IdentityUser> signInManager, UserManager<IdentityUser> userManager)
13+
{
14+
_signInManager = signInManager;
15+
_userManager = userManager;
16+
}
17+
18+
[HttpPost]
19+
public async Task<IActionResult> Login(string userName, string password)
20+
{
21+
if (userName == null || password == null)
22+
return BadRequest();
23+
24+
var user = await _userManager.FindByNameAsync(userName);
25+
if (user == null)
26+
return BadRequest();
27+
28+
var result = await _signInManager.PasswordSignInAsync(user, password, false, false);
29+
if (result.Succeeded)
30+
return Ok();
31+
32+
return BadRequest();
33+
}
34+
}
35+
}

test/DynamicRoleBasedAuthorization.Tests/DynamicAuthorizationFilterTests.cs

Lines changed: 0 additions & 6 deletions
This file was deleted.
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using DynamicRoleBasedAuthorization.Tests.TestSetup;
2+
using Microsoft.AspNetCore.Hosting;
3+
using Microsoft.AspNetCore.TestHost;
4+
using System.Net;
5+
using System.Net.Http;
6+
using System.Text;
7+
using System.Threading.Tasks;
8+
using Xunit;
9+
10+
namespace DynamicRoleBasedAuthorization.Tests
11+
{
12+
public class DynamicAuthorizationTests
13+
{
14+
private readonly HttpClient _httpClient;
15+
16+
public DynamicAuthorizationTests()
17+
{
18+
var builder = new WebHostBuilder().UseStartup<Startup>();
19+
var testServer = new TestServer(builder);
20+
_httpClient = testServer.CreateClient();
21+
}
22+
23+
[Fact]
24+
public async Task Default_Admin_User_Can_Access_Any_Authorized_Url()
25+
{
26+
// Arrange
27+
await Login(InitialData.SuperUser.UserName, InitialData.DefaultPassword);
28+
29+
// Act
30+
var response = await _httpClient.GetAsync("/authorized/action1");
31+
var response2 = await _httpClient.GetAsync("/actionAuthorized/AuthorizedAction");
32+
33+
// Assert
34+
response.EnsureSuccessStatusCode();
35+
response2.EnsureSuccessStatusCode();
36+
}
37+
38+
[Fact]
39+
public async Task User_Without_Role_Can_Not_Access_Authorized_Url()
40+
{
41+
// Arrange
42+
await Login(InitialData.AdminUser.UserName, InitialData.DefaultPassword);
43+
44+
// Act
45+
var response = await _httpClient.GetAsync("/authorized/action1");
46+
47+
// Assert
48+
49+
Assert.Equal(HttpStatusCode.Forbidden, response.StatusCode);
50+
}
51+
52+
public async Task Login(string userName, string password)
53+
{
54+
var content = new MultipartFormDataContent
55+
{
56+
{ new StringContent(userName, Encoding.UTF8), "userName"},
57+
{ new StringContent(password, Encoding.UTF8),"password"}
58+
};
59+
60+
var response = await _httpClient.PostAsync("/user/login", content);
61+
response.EnsureSuccessStatusCode();
62+
var cookie = response.Headers.GetValues("Set-Cookie");
63+
_httpClient.DefaultRequestHeaders.Add("cookie", cookie);
64+
}
65+
}
66+
}

test/DynamicRoleBasedAuthorization.Tests/Startup.cs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1-
using DynamicRoleBasedAuthorization.Tests.TestSetup;
1+
using DynamicAuthorization.Mvc.Core.Extensions;
2+
using DynamicAuthorization.Mvc.JsonStore.Extensions;
3+
using DynamicRoleBasedAuthorization.Tests.TestSetup;
24
using Microsoft.AspNetCore.Builder;
5+
using Microsoft.AspNetCore.Http;
36
using Microsoft.AspNetCore.Identity;
47
using Microsoft.EntityFrameworkCore;
58
using Microsoft.Extensions.Configuration;
69
using Microsoft.Extensions.DependencyInjection;
710
using Microsoft.Extensions.Hosting;
11+
using System.Threading.Tasks;
812

913
namespace DynamicRoleBasedAuthorization.Tests
1014
{
@@ -20,13 +24,30 @@ public Startup(IConfiguration configuration)
2024
// This method gets called by the runtime. Use this method to add services to the container.
2125
public void ConfigureServices(IServiceCollection services)
2226
{
27+
services.AddControllersWithViews();
28+
2329
services.AddDbContext<ApplicationDbContext>(options => options.UseInMemoryDatabase("InMemoryDbForTesting"));
2430

2531
services.AddIdentity<IdentityUser, IdentityRole>(options => options.SignIn.RequireConfirmedAccount = false)
2632
.AddEntityFrameworkStores<ApplicationDbContext>()
2733
.AddDefaultTokenProviders();
2834

29-
services.AddControllersWithViews();
35+
services.ConfigureApplicationCookie(options =>
36+
{
37+
options.Events.OnRedirectToLogin = context =>
38+
{
39+
context.Response.StatusCode = StatusCodes.Status401Unauthorized;
40+
return Task.CompletedTask;
41+
};
42+
options.Events.OnRedirectToAccessDenied = context =>
43+
{
44+
context.Response.StatusCode = StatusCodes.Status403Forbidden;
45+
return Task.CompletedTask;
46+
};
47+
});
48+
49+
services.AddDynamicAuthorization<ApplicationDbContext>(options => options.DefaultAdminUser = InitialData.SuperUser.UserName)
50+
.AddJsonStore();
3051

3152
services.AddScoped<DbInitializer>();
3253
}
@@ -52,7 +73,7 @@ public void Configure(IApplicationBuilder app, IHostApplicationLifetime applicat
5273
{
5374
using var scope = app.ApplicationServices.CreateScope();
5475
var dbInitializer = scope.ServiceProvider.GetService<DbInitializer>();
55-
dbInitializer.InitializeDb();
76+
dbInitializer.InitializeDbAsync().GetAwaiter().GetResult();
5677
});
5778
}
5879
}
Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Microsoft.AspNetCore.Identity;
1+
using System.Threading.Tasks;
2+
using Microsoft.AspNetCore.Identity;
23

34
namespace DynamicRoleBasedAuthorization.Tests.TestSetup
45
{
@@ -13,13 +14,13 @@ public DbInitializer(UserManager<IdentityUser> userManager, RoleManager<Identity
1314
_roleManager = roleManager;
1415
}
1516

16-
public void InitializeDb()
17+
public async Task InitializeDbAsync()
1718
{
18-
_userManager.CreateAsync(InitialData.SuperUser, "123@Qaz45").GetAwaiter().GetResult();
19-
_userManager.CreateAsync(InitialData.AdminUser, "123@Qaz45").GetAwaiter().GetResult();
20-
_userManager.CreateAsync(InitialData.OrdinaryUser, "123@Qaz45").GetAwaiter().GetResult();
21-
_roleManager.CreateAsync(InitialData.AdminRole).GetAwaiter().GetResult();
22-
_roleManager.CreateAsync(InitialData.RestrictedRole).GetAwaiter().GetResult();
19+
await _userManager.CreateAsync(InitialData.SuperUser, InitialData.DefaultPassword);
20+
await _userManager.CreateAsync(InitialData.AdminUser, InitialData.DefaultPassword);
21+
await _userManager.CreateAsync(InitialData.OrdinaryUser, InitialData.DefaultPassword);
22+
await _roleManager.CreateAsync(InitialData.AdminRole);
23+
await _roleManager.CreateAsync(InitialData.RestrictedRole);
2324
}
2425
}
2526
}

test/DynamicRoleBasedAuthorization.Tests/TestSetup/InitialData.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,7 @@ public class InitialData
1313
public static IdentityRole AdminRole => new IdentityRole("AdminRole");
1414

1515
public static IdentityRole RestrictedRole => new IdentityRole("RestrictedRole");
16+
17+
public const string DefaultPassword = "123@Qaz45";
1618
}
1719
}

test/DynamicRoleBasedAuthorization.Tests/TestSetup/TestingWebApplicationFactory.cs

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

0 commit comments

Comments
 (0)