11using DynamicAuthorization . Mvc . Core . Models ;
22using Microsoft . AspNetCore . Authorization ;
3+ using Microsoft . AspNetCore . Identity . EntityFrameworkCore ;
34using Microsoft . AspNetCore . Mvc ;
45using Microsoft . AspNetCore . Mvc . Authorization ;
56using Microsoft . AspNetCore . Mvc . Controllers ;
67using Microsoft . AspNetCore . Mvc . Filters ;
8+ using Microsoft . EntityFrameworkCore ;
79using System ;
810using System . Linq ;
911using System . Reflection ;
1012using System . Threading . Tasks ;
1113
1214namespace DynamicAuthorization . Mvc . Core
1315{
14- public class DynamicAuthorizationFilter : IAuthorizationFilter , IAsyncAuthorizationFilter
16+ public class DynamicAuthorizationFilter < TDbContext > : IAuthorizationFilter , IAsyncAuthorizationFilter
17+ where TDbContext : IdentityDbContext
1518 {
1619 private readonly DynamicAuthorizationOptions _authorizationOptions ;
20+ private readonly TDbContext _identityDbContext ;
1721 private readonly IRoleAccessStore _roleAccessStore ;
1822
19- public DynamicAuthorizationFilter ( DynamicAuthorizationOptions authorizationOptions , IRoleAccessStore roleAccessStore )
23+ public DynamicAuthorizationFilter (
24+ DynamicAuthorizationOptions authorizationOptions ,
25+ TDbContext identityDbContext ,
26+ IRoleAccessStore roleAccessStore
27+ )
2028 {
2129 _authorizationOptions = authorizationOptions ;
2230 _roleAccessStore = roleAccessStore ;
31+ _identityDbContext = identityDbContext ;
2332 }
2433
2534 public void OnAuthorization ( AuthorizationFilterContext context )
@@ -43,8 +52,15 @@ public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
4352 return ;
4453
4554 var actionId = GetActionId ( context ) ;
46-
47- if ( await _roleAccessStore . HasAccessToActionAsync ( userName , actionId ) )
55+ var roles = await (
56+ from user in _identityDbContext . Users
57+ join userRole in _identityDbContext . UserRoles on user . Id equals userRole . UserId
58+ join role in _identityDbContext . Roles on userRole . RoleId equals role . Id
59+ where user . UserName == userName
60+ select role . Id
61+ ) . ToArrayAsync ( ) ;
62+
63+ if ( await _roleAccessStore . HasAccessToActionAsync ( actionId , roles ) )
4864 return ;
4965
5066 context . Result = new ForbidResult ( ) ;
@@ -54,7 +70,10 @@ public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
5470
5571 private static bool IsProtectedAction ( AuthorizationFilterContext context )
5672 {
57- var controllerActionDescriptor = ( ControllerActionDescriptor ) context . ActionDescriptor ;
73+ var controllerActionDescriptor = context . ActionDescriptor as ControllerActionDescriptor ;
74+ if ( controllerActionDescriptor == null )
75+ return false ;
76+
5877 var controllerTypeInfo = controllerActionDescriptor . ControllerTypeInfo ;
5978
6079 var anonymousAttribute = controllerTypeInfo . GetCustomAttribute < AllowAnonymousAttribute > ( ) ;
@@ -84,7 +103,10 @@ private bool IsProtectedAction(AuthorizationFilterContext context)
84103 if ( context . Filters . Any ( item => item is IAllowAnonymousFilter ) )
85104 return false ;
86105
87- var controllerActionDescriptor = ( ControllerActionDescriptor ) context . ActionDescriptor ;
106+ var controllerActionDescriptor = context . ActionDescriptor as ControllerActionDescriptor ;
107+ if ( controllerActionDescriptor == null )
108+ return false ;
109+
88110 var controllerTypeInfo = controllerActionDescriptor . ControllerTypeInfo ;
89111 var actionMethodInfo = controllerActionDescriptor . MethodInfo ;
90112
0 commit comments