Typically, you will have an http module that will check cookies, and once the FedAuth token is found, you have a hook to create the claims and credentials principle.
Usually you do not need to save the entire user profile, just useful things that usually do not change often. I do this inside an ActionFilter.
Here is the code I found that does all this.
https://github.com/wcpro/ScaffR/tree/master/src/ScaffR.Security/content/CodeTemplates/Scaffolders/ScaffR.Security
You may have to dig a little, but everything is there.
Here is the code for the http module
public class ClaimsTransformationHttpModule : IHttpModule { public void Init(HttpApplication context) { context.PostAuthenticateRequest += context_PostAuthenticateRequest; } void context_PostAuthenticateRequest(object sender, EventArgs e) { var context = ((HttpApplication) sender).Context; if (FederatedAuthentication.SessionAuthenticationModule != null && FederatedAuthentication.SessionAuthenticationModule.ContainsSessionTokenCookie(context.Request.Cookies)) { return; } var transformer = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.ClaimsAuthenticationManager; if (transformer != null) { var transformedPrincipal = transformer.Authenticate(context.Request.RawUrl, context.User as ClaimsPrincipal); context.User = transformedPrincipal; Thread.CurrentPrincipal = transformedPrincipal; } } public void Dispose() { } }
Here is the Transformer Claims
public partial class ClaimsTransformer : ClaimsAuthenticationManager { partial void SetCustomPrincipalClaims(IUserService userService, ref ClaimsPrincipal principal); public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal) { if (!incomingPrincipal.Identity.IsAuthenticated) { return incomingPrincipal; } var newPrincipal = Transform(incomingPrincipal); EstablishSession(newPrincipal); return newPrincipal; } ClaimsPrincipal Transform(ClaimsPrincipal incomingPrincipal) { var nameClaim = incomingPrincipal.Identities.First().FindFirst(ClaimTypes.Name); var userService = DependencyResolver.Current.GetService<IUserService>(); var user = userService.GetByUsername(nameClaim.Value); var id = new ApplicationIdentity(user); var principal = new ClaimsPrincipal(id); SetCustomPrincipalClaims(userService, ref principal); return principal; } private void EstablishSession(ClaimsPrincipal principal) { if (HttpContext.Current != null) { var sessionToken = new SessionSecurityToken(principal); FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken); } } }
Then here is the configuration
<?xml version="1.0" encoding="utf-8"?> <system.identityModel> <identityConfiguration> <claimsAuthenticationManager type="Barbarella.Core.Common.Security.ClaimsTransformer, Barbarella.Core" /> </identityConfiguration> </system.identityModel>
And this...
<system.identityModel.services> <federationConfiguration> <cookieHandler mode="Default" requireSsl="false" /> </federationConfiguration> </system.identityModel.services>
And this...
<system.webServer> <validation validateIntegratedModeConfiguration="false" /> <modules runAllManagedModulesForAllRequests="true"> <add name="ClaimsTransformationModule" type="Barbarella.Core.Common.Security.ClaimsTransformationHttpModule, Barbarella.Core" /> <add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </modules>
Remember to add configuration sections
<section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> <section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
Here is my code for ApplicationIdentity (overrides ClaimsIDentity) ... This is the code that really answers your question ...
public sealed partial class ApplicationIdentity : ClaimsIdentity { partial void SetCustomIdentityClaims(User user); private readonly User _user; public ApplicationIdentity(User user) : base("Application") { _user = user; AddClaim(new Claim(ClaimTypes.Name, user.Username)); AddClaim(new Claim(ApplicationClaimTypes.UserId, user.Id.ToString(CultureInfo.InvariantCulture))); AddClaim(new Claim(ApplicationClaimTypes.FirstName, user.FirstName)); AddClaim(new Claim(ApplicationClaimTypes.LastName, user.LastName)); AddClaim(new Claim("Time", DateTime.Now.ToString())); SetCustomIdentityClaims(_user); } public User User { get { return _user; } } public int UserId { get { return int.Parse(FindFirst(ApplicationClaimTypes.UserId).Value); } } public string Username { get { return FindFirst(ClaimTypes.Name).Value; } } }