The Scratch Custom Claims Provider
Frequently, I find it useful to have a common starting point – what Raymond Chen describes as a “scratch program” (or a new scratch program, for those update-minded types). Within SharePoint, things are never that simple – a scratch SharePoint solution is an empty whiteboard, for better or for worse.
There are plenty of extensibility points within SharePoint that certainly offer up opportunities for scratch programs, though, and one place I find myself sharing – over and over again – my personal scratch implementation is with Custom Claims Providers. And so I submit for your approval, the SimpleClaimsProvider in all its favoriteColor issuing claim glory. This will serve as a starting point for future posts involving custom claims providers, and in the meantime might give a few of you the bits you need in order to make the details of Custom Claims Providers real. For a complete walkthrough, see Steve Peschka’s most excellent write up over on MSDN.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 using Microsoft.SharePoint;
7 using Microsoft.SharePoint.WebControls;
8 using Microsoft.SharePoint.Administration;
9 using Microsoft.SharePoint.Administration.Claims;
10
11 namespace BryanPorter.SP.CCP
12 {
13 public class SimpleClaimsProvider
14 : SPClaimProvider
15 {
16 private static string m_claimValueType = Microsoft.IdentityModel.Claims.ClaimValueTypes.String;
17 private static string m_claimType = "https://schemas.bryanporter.com/favoriteColor";
18
19 private string m_sharedState = null;
20
21 public SimpleClaimsProvider(string displayName)
22 : base(displayName)
23 { }
24
25 protected override void FillClaimTypes(List<string> claimTypes)
26 {
27 if (claimTypes == null)
28 throw new ArgumentNullException("claimTypes");
29
30 claimTypes.Add(m_claimType);
31 }
32
33 protected override void FillClaimValueTypes(List<string> claimValueTypes)
34 {
35 if (claimValueTypes == null)
36 throw new ArgumentNullException("claimValueTypes");
37
38 claimValueTypes.Add(m_claimValueType);
39 }
40
41 protected override void FillClaimsForEntity(Uri context, SPClaim entity, List<SPClaim> claims)
42 {
43 if (entity == null)
44 throw new ArgumentNullException("entity");
45
46 if (claims == null)
47 throw new ArgumentNullException("claims");
48
49 claims.Add(CreateClaim(m_claimType, "Blue", m_claimValueType));
50 }
51
52 protected override void FillEntityTypes(List<string> entityTypes)
53 {
54 entityTypes.Add(SPClaimEntityTypes.FormsRole);
55 }
56
57 protected override void FillHierarchy(Uri context, string[] entityTypes, string hierarchyNodeID, int numberOfLevels, Microsoft.SharePoint.WebControls.SPProviderHierarchyTree hierarchy)
58 {
59 throw new NotImplementedException();
60 }
61
62 protected override void FillResolve(Uri context, string[] entityTypes, SPClaim resolveInput, List<Microsoft.SharePoint.WebControls.PickerEntity> resolved)
63 {
64 if (!EntityTypesContain(entityTypes, SPClaimEntityTypes.FormsRole))
65 return;
66
67 PickerEntity pe = CreatePickerEntity();
68 pe.Claim = CreateClaim(m_claimType, "Blue", m_claimValueType);
69 pe.Description = Name + ":" + "Blue";
70 pe.DisplayText = "Blue";
71 pe.EntityData[PeopleEditorEntityDataKeys.DisplayName] = "Blue";
72 pe.EntityType = SPClaimEntityTypes.FormsRole;
73 pe.IsResolved = true;
74 pe.EntityGroupName = "Favorite Color";
75
76 resolved.Add(pe);
77 }
78
79 protected override void FillResolve(Uri context, string[] entityTypes, string resolveInput, List<Microsoft.SharePoint.WebControls.PickerEntity> resolved)
80 {
81 if (!EntityTypesContain(entityTypes, SPClaimEntityTypes.FormsRole))
82 return;
83
84 if (resolveInput.ToUpper().Contains("BLUE"))
85 {
86 PickerEntity pe = CreatePickerEntity();
87 pe.Claim = CreateClaim(m_claimType, "Blue", m_claimValueType);
88 pe.Description = Name + ":" + "Blue";
89 pe.DisplayText = "Blue";
90 pe.EntityData[PeopleEditorEntityDataKeys.DisplayName] = "Blue";
91 pe.EntityType = SPClaimEntityTypes.FormsRole;
92 pe.IsResolved = true;
93 pe.EntityGroupName = "Favorite Color";
94
95 resolved.Add(pe);
96 }
97
98 }
99
100 protected override void FillSchema(Microsoft.SharePoint.WebControls.SPProviderSchema schema)
101 {
102 schema.AddSchemaElement(new SPSchemaElement(PeopleEditorEntityDataKeys.DisplayName, "Display Name", SPSchemaElementType.Both));
103 }
104
105 protected override void FillSearch(Uri context, string[] entityTypes, string searchPattern, string hierarchyNodeID, int maxCount, Microsoft.SharePoint.WebControls.SPProviderHierarchyTree searchTree)
106 {
107 if (!EntityTypesContain(entityTypes, SPClaimEntityTypes.FormsRole))
108 return;
109
110 if (searchPattern.ToUpper().Contains("BLUE"))
111 {
112 PickerEntity pe = CreatePickerEntity();
113 pe.Claim = CreateClaim(m_claimType, "Blue", m_claimValueType);
114 pe.Description = Name + ":" + "Blue";
115 pe.DisplayText = "Blue";
116 pe.EntityData[PeopleEditorEntityDataKeys.DisplayName] = "Blue";
117 pe.EntityType = SPClaimEntityTypes.FormsRole;
118 pe.IsResolved = true;
119 pe.EntityGroupName = "Favorite Color";
120
121
122 searchTree.AddEntity(pe);
123 }
124 }
125
126 public override string Name
127 {
128 get { return "SimpleCCP"; }
129 }
130
131 public override bool SupportsEntityInformation
132 {
133 get { return true; }
134 }
135
136 public override bool SupportsHierarchy
137 {
138 get { return false; }
139 }
140
141 public override bool SupportsResolve
142 {
143 get { return true; }
144 }
145
146 public override bool SupportsSearch
147 {
148 get { return true; }
149 }
150 }
151 }