Orchard Core Permission Providers - Prompt Templates
Create a Permission Provider
You are an Orchard Core expert. Generate permission-provider code that follows Orchard Core conventions and CrestApps project structure.
Guidelines
- Name the provider class
PermissionProvider. - Keep the provider class
internal sealed. - Implement
IPermissionProvider. - Use
OrchardCoreConstants.Roles.Administratorinstead of hard-coded"Administrator". - Keep reusable static permission instances outside the provider class.
- Place reusable static permission instances in the corresponding
*.Coreproject for the feature, for exampleCrestApps.Sports.Teams.Core. - Place reusable content-part models that are shared between runtime services, display drivers, and feature code in the corresponding
*.Coreproject. - Keep the feature project focused on Orchard feature wiring such as
Startup, display drivers, controllers, and views.
Recommended Project Placement
src/Core/{{FeatureName}}.Core/Permissions/{{FeatureName}}Permissions.cssrc/Core/{{FeatureName}}.Core/Models/{{ContentPart}}.cssrc/Modules/{{FeatureName}}/PermissionProvider.cssrc/Modules/{{FeatureName}}/Startup.cs
Static Permission Definitions in a Core Project
using OrchardCore.Security.Permissions;
namespace CrestApps.Sports.Teams.Core.Permissions;
public static class TeamPermissions
{
public static readonly Permission ManageTeams = new("ManageTeams", "Manage teams");
}
PermissionProvider Class
using CrestApps.Sports.Teams.Core.Permissions;
using OrchardCore;
using OrchardCore.Security.Permissions;
namespace CrestApps.Sports.Teams;
internal sealed class PermissionProvider : IPermissionProvider
{
private readonly IEnumerable<Permission> _allPermissions =
[
TeamPermissions.ManageTeams,
];
public Task<IEnumerable<Permission>> GetPermissionsAsync()
=> Task.FromResult(_allPermissions);
public IEnumerable<PermissionStereotype> GetDefaultStereotypes() =>
[
new PermissionStereotype
{
Name = OrchardCoreConstants.Roles.Administrator,
Permissions =
[
TeamPermissions.ManageTeams,
],
},
new PermissionStereotype
{
Name = "Coach",
Permissions =
[
TeamPermissions.ManageTeams,
],
},
];
}
Registering the Provider
using Microsoft.Extensions.DependencyInjection;
using OrchardCore.Modules;
using OrchardCore.Security.Permissions;
namespace CrestApps.Sports.Teams;
public sealed class Startup : StartupBase
{
public override void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IPermissionProvider, PermissionProvider>();
}
}
Content Part Placement Guidance
When a content part model is reused by services or other projects, move it into the matching *.Core project:
using OrchardCore.ContentManagement;
namespace CrestApps.Sports.Teams.Core.Models;
public sealed class TeamPart : ContentPart
{
public string AgeGroup { get; set; }
public string Level { get; set; }
}
The feature project should reference the core project and use that shared model from drivers, services, and startup wiring.