//-----------------------------------------------------------------------
//
// Copyright (c) Andrew Arnott. All rights reserved.
//
//-----------------------------------------------------------------------
namespace RelyingPartyLogic {
using System;
using System.Collections.Generic;
using System.IdentityModel.Claims;
using System.Linq;
using System.Web;
using DotNetOpenAuth.InfoCard;
using DotNetOpenAuth.OpenId;
using DotNetOpenAuth.OpenId.Extensions.SimpleRegistration;
using DotNetOpenAuth.OpenId.RelyingParty;
public partial class User {
///
/// Initializes a new instance of the class.
///
public User() {
this.CreatedOnUtc = DateTime.UtcNow;
}
public static AuthenticationToken ProcessUserLogin(IAuthenticationResponse openIdResponse) {
bool trustedEmail = Policies.ProviderEndpointsProvidingTrustedEmails.Contains(openIdResponse.Provider.Uri);
return ProcessUserLogin(openIdResponse.ClaimedIdentifier, openIdResponse.FriendlyIdentifierForDisplay, openIdResponse.GetExtension(), null, trustedEmail);
}
public static AuthenticationToken ProcessUserLogin(Token samlToken) {
bool trustedEmail = false; // we don't trust InfoCard email addresses, since these can be self-issued.
return ProcessUserLogin(
AuthenticationToken.SynthesizeClaimedIdentifierFromInfoCard(samlToken.UniqueId),
samlToken.SiteSpecificId,
null,
samlToken,
trustedEmail);
}
private static AuthenticationToken ProcessUserLogin(string claimedIdentifier, string friendlyIdentifier, ClaimsResponse claims, Token samlToken, bool trustedEmail) {
// Create an account for this user if we don't already have one.
AuthenticationToken openidToken = Database.DataContext.AuthenticationTokens.FirstOrDefault(token => token.ClaimedIdentifier == claimedIdentifier);
if (openidToken == null) {
// this is a user we haven't seen before.
User user = new User();
openidToken = new AuthenticationToken {
ClaimedIdentifier = claimedIdentifier,
FriendlyIdentifier = friendlyIdentifier,
};
user.AuthenticationTokens.Add(openidToken);
// Gather information about the user if it's available.
if (claims != null) {
if (!string.IsNullOrEmpty(claims.Email)) {
user.EmailAddress = claims.Email;
user.EmailAddressVerified = trustedEmail;
}
if (!string.IsNullOrEmpty(claims.FullName)) {
if (claims.FullName.IndexOf(' ') > 0) {
user.FirstName = claims.FullName.Substring(0, claims.FullName.IndexOf(' ')).Trim();
user.LastName = claims.FullName.Substring(claims.FullName.IndexOf(' ')).Trim();
} else {
user.FirstName = claims.FullName;
}
}
} else if (samlToken != null) {
string email, givenName, surname;
if (samlToken.Claims.TryGetValue(ClaimTypes.Email, out email)) {
user.EmailAddress = email;
user.EmailAddressVerified = trustedEmail;
}
if (samlToken.Claims.TryGetValue(ClaimTypes.GivenName, out givenName)) {
user.FirstName = givenName;
}
if (samlToken.Claims.TryGetValue(ClaimTypes.Surname, out surname)) {
user.LastName = surname;
}
}
Database.DataContext.AddToUsers(user);
} else {
openidToken.UsageCount++;
openidToken.LastUsedUtc = DateTime.UtcNow;
}
return openidToken;
}
partial void OnCreatedOnUtcChanging(DateTime value) {
Utilities.VerifyThrowNotLocalTime(value);
}
partial void OnEmailAddressChanged() {
// Whenever the email address is changed, we must reset its verified status.
this.EmailAddressVerified = false;
}
}
}