Base solution for your next web application
Starts in:
01 DAYS
01 HRS
01 MIN
01 SEC

Activities of "Astech"

Hi @ismcagdas

Apologies for bringing up such an old thread. However, we are trying to do exactly what @jfmeyers was describing several years ago, and introduce a setting whereby tenants can Allow Public Access to just some areas.

The easiest route we can see to achieving this is the create our own AbpAuthorizationFilter implementation which we have done:

public class PublicIfSetMvcAuthorizeFilter : AbpAuthorizationFilter
{
    ITenantSettingsAppService _tenantSettingsAppService;

    public CustomMvcAuthorizeFilter(IAuthorizationHelper authorizationHelper, IErrorInfoBuilder errorInfoBuilder, IEventBus eventBus, ITenantSettingsAppService tenantSettingsAppService) : base(authorizationHelper, errorInfoBuilder, eventBus)
    {
        _tenantSettingsAppService = tenantSettingsAppService;
    }

    public new async Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        var setting = await _tenantSettingsAppService.GetAllowPublicAccessSettingAsync();

        if (setting.AllowPublicAccess)
	    return;

        await base.OnAuthorizationAsync(context);
    }
}

We are then hoping to use a Custom MvcAuthorizeAttribute to mark methods that allow public access (when the setting is set to true) while leaving other methods using the original AbpMvcAuthorize which will always require the specified permission. For example:

[PublicIfSetMvcAuthorizeAttribute(AppPermissions.Pages_Teams)]
public ActionResult Index()
{
    // If the global "Allow public access" setting is true, anyone can get here. Else, only allow people with AppPermissions.Pages_Teams allowed
}

[AbpMvcAuthorize(AppPermissions.Pages_Teams)]
public async Task<PartialViewResult> CreateOrEditTeamModal(int? id)
{
     // Only allow people with AppPermissions.Pages_Teams allowed
}

We have created the PublicIfSetMvcAuthorizeFilter (as above). We have also created the PublicIfSetMvcAuthorizeAttribute:

public class PublicIfSetMvcAuthorizeAttribute : AbpMvcAuthorizeAttribute
    {
        public PublicIfSetMvcAuthorizeAttribute(params string[] permissions)
        {
            Permissions = permissions;
        }
    }

How do we set our new attribute so that it uses our new filter, while still leaving the original attribute using the original filter? At the moment when we use our new attribute it simply applies the original filter still.

Many thanks in advance,

That's worked, many thanks @ismcagdas

Hi @ismcagdas,

I have tried both solutions and still get the same error.

C:\Repos\Congresso\src\Congresso.Web.Mvc>npm install yarn npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: [email protected] npm ERR! Found: [email protected] npm ERR! node_modules/bootstrap npm ERR! bootstrap@"4.3.1" from the root project npm ERR! npm ERR! Could not resolve dependency: npm ERR! peer bootstrap@"^3.1.1" from [email protected] npm ERR! node_modules/bootstrap-switch npm ERR! bootstrap-switch@"3.3.4" from the root project npm ERR! npm ERR! Fix the upstream dependency conflict, or retry npm ERR! this command with --force, or --legacy-peer-deps npm ERR! to accept an incorrect (and potentially broken) dependency resolution. npm ERR! npm ERR! See C:\Users\JRadu\AppData\Local\npm-cache\eresolve-report.txt for a full report.

npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\JRadu\AppData\Local\npm-cache_logs\2021-04-29T09_35_41_213Z-debug.log

Here is the log:

0 verbose cli [ 0 verbose cli 'C:\Program Files\nodejs\node.exe', 0 verbose cli 'C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\bin\npm-cli.js', 0 verbose cli 'install', 0 verbose cli 'yarn' 0 verbose cli ] 1 info using [email protected] 2 info using [email protected] 3 timing npm:load:whichnode Completed in 1ms 4 timing config:load:defaults Completed in 2ms 5 timing config:load:file:C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\npmrc Completed in 2ms 6 timing config:load:builtin Completed in 2ms 7 timing config:load:cli Completed in 1ms 8 timing config:load:env Completed in 1ms 9 timing config:load:file:C:\Repos\Congresso\src\Congresso.Web.Mvc.npmrc Completed in 1ms 10 timing config:load:project Completed in 1ms 11 timing config:load:file:C:\Users\JRadu.npmrc Completed in 0ms 12 timing config:load:user Completed in 0ms 13 timing config:load:file:C:\Users\JRadu\AppData\Roaming\npm\etc\npmrc Completed in 0ms 14 timing config:load:global Completed in 1ms 15 timing config:load:validate Completed in 0ms 16 timing config:load:credentials Completed in 1ms 17 timing config:load:setEnvs Completed in 1ms 18 timing config:load Completed in 10ms 19 timing npm:load:configload Completed in 10ms 20 timing npm:load:setTitle Completed in 0ms 21 timing npm:load:setupLog Completed in 2ms 22 timing npm:load:cleanupLog Completed in 2ms 23 timing npm:load:configScope Completed in 0ms 24 timing npm:load:projectScope Completed in 1ms 25 timing npm:load Completed in 18ms 26 timing config:load:flatten Completed in 3ms 27 timing arborist:ctor Completed in 1ms 28 timing idealTree:init Completed in 14ms 29 timing idealTree:userRequests Completed in 2ms 30 silly idealTree buildDeps 31 silly fetch manifest @types/node@^12.7.4 32 http fetch GET 304 https://registry.npmjs.org/@types%2fnode 661ms (from cache) 33 silly fetch manifest globby@^9.2.0 34 http fetch GET 304 https://registry.npmjs.org/globby 81ms (from cache) 35 silly fetch manifest gulp@^4.0.1 36 http fetch GET 304 https://registry.npmjs.org/gulp 137ms (from cache) 37 silly fetch manifest gulp-clean-css@^4.2.0 38 http fetch GET 304 https://registry.npmjs.org/gulp-clean-css 57ms (from cache) 39 silly fetch manifest gulp-concat@^2.6.1 40 http fetch GET 304 https://registry.npmjs.org/gulp-concat 79ms (from cache) 41 silly fetch manifest gulp-less@^4.0.1 42 http fetch GET 200 https://registry.npmjs.org/gulp-less 6ms (from cache) 43 silly fetch manifest gulp-postcss@^8.0.0 44 http fetch GET 304 https://registry.npmjs.org/gulp-postcss 52ms (from cache) 45 silly fetch manifest gulp-uglify-es@^1.0.4 46 http fetch GET 304 https://registry.npmjs.org/gulp-uglify-es 62ms (from cache) 47 silly fetch manifest merge-stream@^2.0.0 48 http fetch GET 304 https://registry.npmjs.org/merge-stream 56ms (from cache) 49 silly fetch manifest postcss-url@^9.0.0 50 http fetch GET 304 https://registry.npmjs.org/postcss-url 83ms (from cache) 51 silly fetch manifest rimraf@^3.0.0 52 http fetch GET 304 https://registry.npmjs.org/rimraf 128ms (from cache) 53 silly fetch manifest yarn@^1.15.0 54 http fetch GET 304 https://registry.npmjs.org/yarn 66ms (from cache) 55 silly fetch manifest @fancyapps/fancybox@^3.5.7 56 http fetch GET 200 https://registry.npmjs.org/@fancyapps%2ffancybox 6ms (from cache) 57 silly fetch manifest jquery@^3.3.1 58 http fetch GET 304 https://registry.npmjs.org/jquery 72ms (from cache) 59 silly fetch manifest @fortawesome/fontawesome-free@^5.8.1 60 http fetch GET 304 https://registry.npmjs.org/@fortawesome%2ffontawesome-free 227ms (from cache) 61 silly fetch manifest @microsoft/signalr@^3.1.2 62 http fetch GET 304 https://registry.npmjs.org/@microsoft%2fsignalr 901ms (from cache) 63 silly fetch manifest [email protected] 64 http fetch GET 200 https://registry.npmjs.org/abp-web-resources 4ms (from cache) 65 silly fetch manifest animate.css@^3.7.0 66 http fetch GET 200 https://registry.npmjs.org/animate.css 4ms (from cache) 67 silly fetch manifest autosize@^4.0.2 68 http fetch GET 304 https://registry.npmjs.org/autosize 51ms (from cache) 69 silly fetch manifest block-ui@^2.70.1 70 http fetch GET 200 https://registry.npmjs.org/block-ui 2ms (from cache) 71 silly fetch manifest blueimp-file-upload@^10.2.0 72 http fetch GET 200 https://registry.npmjs.org/blueimp-file-upload 2ms (from cache) 73 silly fetch manifest [email protected] 74 http fetch GET 304 https://registry.npmjs.org/bootstrap 74ms (from cache) 75 silly fetch manifest popper.js@^1.14.7 76 http fetch GET 304 https://registry.npmjs.org/popper.js 759ms (from cache) 77 silly fetch manifest bootstrap-daterangepicker@^3.0.3 78 http fetch GET 200 https://registry.npmjs.org/bootstrap-daterangepicker 3ms (from cache) 79 silly fetch manifest bootstrap-hover-dropdown@^2.2.1 80 http fetch GET 200 https://registry.npmjs.org/bootstrap-hover-dropdown 2ms (from cache) 81 silly fetch manifest bootstrap-markdown@^2.10.0 82 http fetch GET 200 https://registry.npmjs.org/bootstrap-markdown 2ms (from cache) 83 silly fetch manifest bootstrap-maxlength@^1.6.0 84 http fetch GET 200 https://registry.npmjs.org/bootstrap-maxlength 3ms (from cache) 85 silly fetch manifest bootstrap-notify@^3.1.3 86 http fetch GET 200 https://registry.npmjs.org/bootstrap-notify 3ms (from cache) 87 silly fetch manifest bootstrap-select@^1.13.9 88 http fetch GET 200 https://registry.npmjs.org/bootstrap-select 5ms (from cache) 89 silly fetch manifest [email protected] 90 http fetch GET 200 https://registry.npmjs.org/bootstrap-switch 4ms (from cache) 91 silly fetch manifest bootstrap@^3.1.1 92 timing idealTree Completed in 3691ms 93 timing command:install Completed in 3700ms 94 verbose stack Error: unable to resolve dependency tree 94 verbose stack at Arborist.[failPeerConflict] (C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\node_modules@npmcli\arborist\lib\arborist\build-ideal-tree.js:1220:25) 94 verbose stack at Arborist.[loadPeerSet] (C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\node_modules@npmcli\arborist\lib\arborist\build-ideal-tree.js:1187:34) 94 verbose stack at async Arborist.[buildDepStep] (C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\node_modules@npmcli\arborist\lib\arborist\build-ideal-tree.js:891:11) 94 verbose stack at async Arborist.buildIdealTree (C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\node_modules@npmcli\arborist\lib\arborist\build-ideal-tree.js:217:7) 94 verbose stack at async Promise.all (index 1) 94 verbose stack at async Arborist.reify (C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\node_modules@npmcli\arborist\lib\arborist\reify.js:135:5) 94 verbose stack at async Install.install (C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\lib\install.js:137:5) 95 verbose cwd C:\Repos\Congresso\src\Congresso.Web.Mvc 96 verbose Windows_NT 10.0.19042 97 verbose argv "C:\Program Files\nodejs\node.exe" "C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\bin\npm-cli.js" "install" "yarn" 98 verbose node v16.0.0 99 verbose npm v7.11.1 100 error code ERESOLVE 101 error ERESOLVE unable to resolve dependency tree 102 error 103 error While resolving: abpzerotemplate@10.0.0 103 error Found: bootstrap@4.3.1 103 error node_modules/bootstrap 103 error bootstrap@"4.3.1" from the root project 103 error 103 error Could not resolve dependency: 103 error peer bootstrap@"^3.1.1" from bootstrap-switch@3.3.4 103 error node_modules/bootstrap-switch 103 error bootstrap-switch@"3.3.4" from the root project 103 error 103 error Fix the upstream dependency conflict, or retry 103 error this command with --force, or --legacy-peer-deps 103 error to accept an incorrect (and potentially broken) dependency resolution. 103 error 103 error See C:\Users\JRadu\AppData\Local\npm-cache\eresolve-report.txt for a full report. 104 verbose exit 1

0 verbose cli [ 0 verbose cli 'C:\Program Files\nodejs\node.exe', 0 verbose cli 'C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\bin\npm-cli.js', 0 verbose cli 'install' 0 verbose cli ] 1 info using [email protected] 2 info using [email protected] 3 timing npm:load:whichnode Completed in 2ms 4 timing config:load:defaults Completed in 1ms 5 timing config:load:file:C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\npmrc Completed in 2ms 6 timing config:load:builtin Completed in 2ms 7 timing config:load:cli Completed in 1ms 8 timing config:load:env Completed in 1ms 9 timing config:load:file:C:\Repos\Congresso\src\Congresso.Web.Mvc.npmrc Completed in 1ms 10 timing config:load:project Completed in 1ms 11 timing config:load:file:C:\Users\JRadu.npmrc Completed in 1ms 12 timing config:load:user Completed in 1ms 13 timing config:load:file:C:\Users\JRadu\AppData\Roaming\npm\etc\npmrc Completed in 0ms 14 timing config:load:global Completed in 0ms 15 timing config:load:validate Completed in 1ms 16 timing config:load:setEnvs Completed in 0ms 17 timing config:load Completed in 8ms 18 timing npm:load:configload Completed in 8ms 19 timing npm:load:setTitle Completed in 1ms 20 timing npm:load:setupLog Completed in 2ms 21 timing npm:load:cleanupLog Completed in 2ms 22 timing npm:load:configScope Completed in 0ms 23 timing npm:load:projectScope Completed in 1ms 24 timing npm:load Completed in 16ms 25 timing config:load:flatten Completed in 2ms 26 timing arborist:ctor Completed in 0ms 27 timing idealTree:init Completed in 27ms 28 timing idealTree:userRequests Completed in 1ms 29 silly idealTree buildDeps 30 silly fetch manifest @types/node@^12.7.4 31 http fetch GET 304 https://registry.npmjs.org/@types%2fnode 703ms (from cache) 32 silly fetch manifest globby@^9.2.0 33 http fetch GET 304 https://registry.npmjs.org/globby 62ms (from cache) 34 silly fetch manifest gulp@^4.0.1 35 http fetch GET 304 https://registry.npmjs.org/gulp 72ms (from cache) 36 silly fetch manifest gulp-clean-css@^4.2.0 37 http fetch GET 304 https://registry.npmjs.org/gulp-clean-css 107ms (from cache) 38 silly fetch manifest gulp-concat@^2.6.1 39 http fetch GET 304 https://registry.npmjs.org/gulp-concat 55ms (from cache) 40 silly fetch manifest gulp-less@^4.0.1 41 http fetch GET 304 https://registry.npmjs.org/gulp-less 61ms (from cache) 42 silly fetch manifest gulp-postcss@^8.0.0 43 http fetch GET 304 https://registry.npmjs.org/gulp-postcss 63ms (from cache) 44 silly fetch manifest gulp-uglify-es@^1.0.4 45 http fetch GET 304 https://registry.npmjs.org/gulp-uglify-es 63ms (from cache) 46 silly fetch manifest merge-stream@^2.0.0 47 http fetch GET 304 https://registry.npmjs.org/merge-stream 75ms (from cache) 48 silly fetch manifest postcss-url@^9.0.0 49 http fetch GET 304 https://registry.npmjs.org/postcss-url 59ms (from cache) 50 silly fetch manifest rimraf@^3.0.0 51 http fetch GET 304 https://registry.npmjs.org/rimraf 67ms (from cache) 52 silly fetch manifest yarn@^1.15.0 53 http fetch GET 304 https://registry.npmjs.org/yarn 93ms (from cache) 54 silly fetch manifest @fancyapps/fancybox@^3.5.7 55 http fetch GET 304 https://registry.npmjs.org/@fancyapps%2ffancybox 174ms (from cache) 56 silly fetch manifest jquery@^3.3.1 57 http fetch GET 304 https://registry.npmjs.org/jquery 86ms (from cache) 58 silly fetch manifest @fortawesome/fontawesome-free@^5.8.1 59 http fetch GET 304 https://registry.npmjs.org/@fortawesome%2ffontawesome-free 194ms (from cache) 60 silly fetch manifest @microsoft/signalr@^3.1.2 61 http fetch GET 304 https://registry.npmjs.org/@microsoft%2fsignalr 142ms (from cache) 62 silly fetch manifest [email protected] 63 http fetch GET 304 https://registry.npmjs.org/abp-web-resources 67ms (from cache) 64 silly fetch manifest animate.css@^3.7.0 65 http fetch GET 304 https://registry.npmjs.org/animate.css 66ms (from cache) 66 silly fetch manifest autosize@^4.0.2 67 http fetch GET 304 https://registry.npmjs.org/autosize 73ms (from cache) 68 silly fetch manifest block-ui@^2.70.1 69 http fetch GET 304 https://registry.npmjs.org/block-ui 68ms (from cache) 70 silly fetch manifest blueimp-file-upload@^10.2.0 71 http fetch GET 304 https://registry.npmjs.org/blueimp-file-upload 88ms (from cache) 72 silly fetch manifest [email protected] 73 http fetch GET 304 https://registry.npmjs.org/bootstrap 64ms (from cache) 74 silly fetch manifest popper.js@^1.14.7 75 http fetch GET 304 https://registry.npmjs.org/popper.js 70ms (from cache) 76 silly fetch manifest bootstrap-daterangepicker@^3.0.3 77 http fetch GET 304 https://registry.npmjs.org/bootstrap-daterangepicker 109ms (from cache) 78 silly fetch manifest bootstrap-hover-dropdown@^2.2.1 79 http fetch GET 304 https://registry.npmjs.org/bootstrap-hover-dropdown 789ms (from cache) 80 silly fetch manifest bootstrap-markdown@^2.10.0 81 http fetch GET 304 https://registry.npmjs.org/bootstrap-markdown 79ms (from cache) 82 silly fetch manifest bootstrap-maxlength@^1.6.0 83 http fetch GET 304 https://registry.npmjs.org/bootstrap-maxlength 842ms (from cache) 84 silly fetch manifest bootstrap-notify@^3.1.3 85 http fetch GET 304 https://registry.npmjs.org/bootstrap-notify 85ms (from cache) 86 silly fetch manifest bootstrap-select@^1.13.9 87 http fetch GET 304 https://registry.npmjs.org/bootstrap-select 89ms (from cache) 88 silly fetch manifest [email protected] 89 http fetch GET 304 https://registry.npmjs.org/bootstrap-switch 103ms (from cache) 90 silly fetch manifest bootstrap@^3.1.1 91 timing idealTree Completed in 4791ms 92 timing command:install Completed in 4800ms 93 verbose stack Error: unable to resolve dependency tree 93 verbose stack at Arborist.[failPeerConflict] (C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\node_modules@npmcli\arborist\lib\arborist\build-ideal-tree.js:1210:25) 93 verbose stack at Arborist.[loadPeerSet] (C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\node_modules@npmcli\arborist\lib\arborist\build-ideal-tree.js:1187:34) 93 verbose stack at async Arborist.[buildDepStep] (C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\node_modules@npmcli\arborist\lib\arborist\build-ideal-tree.js:891:11) 93 verbose stack at async Arborist.buildIdealTree (C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\node_modules@npmcli\arborist\lib\arborist\build-ideal-tree.js:217:7) 93 verbose stack at async Promise.all (index 1) 93 verbose stack at async Arborist.reify (C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\node_modules@npmcli\arborist\lib\arborist\reify.js:134:5) 93 verbose stack at async Install.install (C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\lib\install.js:137:5) 94 verbose cwd C:\Repos\Congresso\src\Congresso.Web.Mvc 95 verbose Windows_NT 10.0.19042 96 verbose argv "C:\Program Files\nodejs\node.exe" "C:\Users\JRadu\AppData\Roaming\npm\node_modules\npm\bin\npm-cli.js" "install" 97 verbose node v14.16.1 98 verbose npm v7.10.0 99 error code ERESOLVE 100 error ERESOLVE unable to resolve dependency tree 101 error 102 error While resolving: abpzerotemplate@10.0.0 102 error Found: bootstrap@4.3.1 102 error node_modules/bootstrap 102 error bootstrap@"4.3.1" from the root project 102 error 102 error Could not resolve dependency: 102 error peer bootstrap@"^3.1.1" from bootstrap-switch@3.3.4 102 error node_modules/bootstrap-switch 102 error bootstrap-switch@"3.3.4" from the root project 102 error 102 error Fix the upstream dependency conflict, or retry 102 error this command with --force, or --legacy-peer-deps 102 error to accept an incorrect (and potentially broken) dependency resolution. 102 error 102 error See C:\Users\JRadu\AppData\Local\npm-cache\eresolve-report.txt for a full report. 103 verbose exit 1

Perfect! Many thanks :)

Hi,

Does this mean there is no way to clear existing cache through the app using the memory cache?

Hi ismcagdas,

I have found a workaround which is to mark the field as readonly instead of disabled. This then allows the required attribute work.

Thanks

Hi @ismcagdas

Thanks for your reply.

you can add required attribute to the input element, so it will be validated when user submits the form.

Unfortunately this does not work. The input is disabled and when disabled it also disables the required attribute.

@ismcagdas Is it possible to get your input on this please?

Thank you

No replies but I shall keep the thread updated with my progress in case anyone else is attempting to do the same in the future (or for if anyone has any input or suggestions).

I could not get the user.OrganizationUnitId or user.OrganizationUnits to populate and they always appear to be null. Therefore I am manually getting them by modifying the CreateAsync method from the guide that I sent a link to above:

public override async Task CreateAsync(User user)
{
    var claim = await base.CreateAsync(user);

    var organizationUnits = await _userManager.GetOrganizationUnitsAsync(user);
    var organizationUnitIds = organizationUnits.Select(ou => ou.Id);

    foreach (var ou in organizationUnitIds)
    {
	claim.Identities.First().AddClaim(new Claim("Application_OrganizationUnitId", ou.ToString()));
    }

    return claim;
}

This seems to work in terms of getting the OU's to create claims however I still need to test the performance hit of doing it this way, as CreateAsync seems to be called multiple times per page load.

This isn't too far away from what we need. However, the more problematic step now is being able to assign multiple OU's against entities. We are also wanting a allow/deny system whereby a user can select a OU for any entity and state whether that OU is allowed or denied access to it. A deny rule will always override an allow.

We are currently looking into this by modifying our entities to have lists of essentially a join table type (called EntityOrganizationUnit). One for allowed and one for denied:

public class Team : FullAuditedEntity, IMayHaveTenant, INeedOrganizationUnitAuthorization
{
    public int? TenantId { get; set; }
    [Required]
    [StringLength(TeamConsts.MaxNameLength, MinimumLength = TeamConsts.MinNameLength)]
    public virtual string Name { get; set; }

    [StringLength(TeamConsts.MaxDescriptionLength, MinimumLength = TeamConsts.MinDescriptionLength)]
    public virtual string Description { get; set; }

    public virtual DateTime StartDate { get; set; }

    public virtual DateTime EndDate { get; set; }

    public List<EntityOrganizationUnit> AllowedOrganizationUnitIds { get; set; }

    public List<EntityOrganizationUnit> DeniedOrganizationUnitIds { get; set; }
}

This EntityOrganizationUnit class will then bridge the gap between any entity (be it a team, player, coach) and it's OU permissions:

public class EntityOrganizationUnit : FullAuditedEntity, IMayHaveTenant
{
    public int? TenantId { get; set; }
    public int EntityTypeId { get; set; }
    public int EntityId { get; set; }
    public int OrganizationUnitId { get; set; } 
    public bool IsAllowOrDeny { get; set; }  //TODO - change to enum
}

This is currently where we are up to and the next stage will involve trying to bring the OU and entities (any entities - not just team) tables together with this join table to create a situation whereby any item added on the system by an end user can have multiple OUs assigned to it to define who (and who cannot) have access to it.

Shall keep you updated with the progress that we make. And if anyone has any comments, suggestions or advice on any of the above, we would love to hear your thoughts.

Thanks, Scott

Showing 41 to 50 of 51 entries