Adding claims support to ASP.NET is a perfect candidate for an HTTP module. As a reminiscence to RoleManager, I called mine ClaimsManager. The job of the claims manager is this:
- Creating claims based on the technical authentication details (Windows, Forms, client certificates etc.)
- Invoking external claims transformation policies which then build the app specific claims based on the technical ones
- Making the AuthorizationContext available to pages (via Thread.CurrentPrincipal/Context.User – see my previous post)
The first step is to write an IAuthorizationPolicy to map the ASP.NET authentication details to claims. This is done by inspecting Context.User.Identity and client certificates – if you use a custom identity, you would amend that code (check my previous posts about authorization policies):
// policy that adds ASP.NET authentication type specific claims
public class AspNetAuthenticationPolicy : IAuthorizationPolicy
{
public bool Evaluate(
EvaluationContext evaluationContext, ref object state)
{
HttpContext context = HttpContext.Current;
List<ClaimSet> claimSets = new List<ClaimSet>();
// Windows or Forms authentication
if (context.User.Identity is WindowsIdentity)
{
claimSets.Add(
new WindowsClaimSet(context.User.Identity as WindowsIdentity));
}
else if (context.User.Identity is FormsIdentity ||
context.User.Identity is GenericIdentity)
{
claimSets.Add(new UserNameClaimSet(context.User.Identity.Name))
}
// client certificate
if (context.Request.ClientCertificate.IsPresent)
{
X509Certificate2 certificate = new X509Certificate2(
context.Request.ClientCertificate.Certificate);
claimSets.Add(new X509CertificateClaimSet(certificate));
}
claimSets.ForEach(set => evaluationContext.AddClaimSet(this, set));
return true;
}
public System.IdentityModel.Claims.ClaimSet Issuer
{
get { return ClaimSet.System; }
}
public string Id
{
get
{
return
“LeastPrivilege.IdentityModel.Web.AspNetAuthorizationPolicy”;
}
}
}
In the next post I will show the HTTP module, how it calls the above policy and how it chains in external policies.