eGandalf
Oct 11, 2016
  6481
(3 votes)

Quick & Dirty Check for Role Permissions on IContent

For some reason, this was not an easy one to find, since most articles focus only on the current user and not using the Episerver APIs for lookups against other users or roles. Though I find it a bit strange, a customer needs to display a list of documents and indicate which among those documents are publicly accessible versus private (members-only). 

Thanks to David Knipe, my Twitter-based weathervane, I came up with a relatively quick and simple set of static methds for doing just that. Providing them here for posterity, allowing you to check a given role for a given permission via a quick extension whenever and wherever you need it.

public static Boolean IsAvailableToEveryone(this T content) where T : IContent
{
    return content.RoleHasAccess(new[] { "Everyone" }, AccessLevel.Read);
}

public static Boolean RoleHasAccess(this T content, string[] roles, AccessLevel accessLevel) where T : IContent
{
    var securedContent = content as ISecurable;
    var descriptor = securedContent.GetSecurityDescriptor();
    var identity = new GenericIdentity("doesn't matter");
    var principal = new GenericPrincipal(identity, roles);
    return descriptor.HasAccess(principal, accessLevel);
}
Oct 11, 2016

Comments

Oct 11, 2016 07:13 PM

Hi,

The last method can't be working. accessLevel.HasFlag(accessLevel) is always true.

eGandalf
eGandalf Oct 11, 2016 07:54 PM

Thanks - idiot copy/paste on my part. Fixed the return. Had it right and then rewrote it poorly.

henriknystrom
henriknystrom Oct 11, 2016 11:13 PM

Good stuff James,

Just want to clarify one thing about this snippet. This code will only check that a role has access to the content according to it's assigned access rights. It won't take into consideration the published state or if the content has been deleted. To get this functionality you can use the IContentAccessEvaluator service.

eGandalf
eGandalf Oct 11, 2016 11:23 PM

Good point, Henrik. However, from what I can tell the IContentAccessEvaluator is an Episerver internal API, not one really intended for our consumption, so I'd prefer to not recommend it.

Seems easy enough to add a check for IsDeleted, though if it's truly generic and I'm not sure whether the content is a Page, Block, Media or other type of IContent, the published status doesn't seem as obvious to check.

eGandalf
eGandalf Oct 11, 2016 11:29 PM

I think I could add these two validators, since PageData has that convenient CheckPublishedStatus, but it still wouldn't cover Blocks or Media.

if (content.IsDeleted) return false;

if(content is PageData)

{

    if (!(content as PageData).CheckPublishedStatus(PagePublishedStatus.Published))

        return false;

}

Please login to comment.
Latest blogs
Optimizely Opal: How to Build Effective Workflow Agents

If you're building workflow agents in Optimizely Opal, this post covers how specialized agents pass context to each other, why keeping agents small...

Andre | May 20, 2026

ReviewPR: An Azure Function That Reviews Your Azure DevOps Pull Requests With Claude

A while back I wrote about an  Azure Function App for PDF creation that we use to offload PDF rendering from our Optimizely DXP site. That same...

KennyG | May 19, 2026

Accelerating Optimizely CMS and Commerce upgrades with agentic AI (Part 2 of 2)

The Real Transformation in Optimizely CMS 13: Why the Upgrade Itself Is the Easy Part. A field-tested playbook for enterprise teams moving from...

Hung Le Hoang | May 18, 2026

Is the most powerful AI model really the best value?

Artificial Intelligence is already becoming part of everyday software development. Developers now use AI tools to generate code, write documentatio...

K Khan | May 16, 2026

Optimizely London Dev Meetup 2026

Well, everyone, it's that time of the year again, and we have another London Developer meet up coming for this summer. The date is set for the 2nd ...

Scott Reed | May 15, 2026

Semantic Search - Deep Dive

Deep dive into semantic search with Optimizely Graph

Michał Mitas | May 14, 2026 |