Existe-t-il un moyen de remplacer HttpContext.Current.User.Identity
pour ajouter une autre propriété (nom d'écran)?
Mon application utilise Identity
et j'ai laissé l'identité unique sous forme de courrier électronique. Je stocke des données utilisateur telles que le prénom/nom dans une table "Profile"
séparée. Existe-t-il un moyen de stocker cette information quelque part dans HttpContext.Current
?
Il n'est pas nécessaire que ce soit dans User
. J'ai fait une recherche et j'ai remarqué qu'il y avait un HttpContext.Current.ProfileBase
. Je ne sais pas trop comment l'utiliser - et je ne veux vraiment pas de tous les excès fournis par la base.
Si vous utilisez Asp.Net Identity, cela est très facile à faire avec les revendications.
Dans votre méthode SignInAsync
(ou, quel que soit le lieu où vous créez l'identité de revendication), ajoutez les types de revendication GivenName
et Surname
:
private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
// Add the users primary identity details to the set of claims.
var your_profile = GetFromYourProfileTable();
identity.AddClaim(new Claim(ClaimTypes.GivenName, your_profile == null ? string.Empty : your_profile.FirstName));
identity.AddClaim(new Claim(ClaimTypes.Surname, your_profile == null ? string.Empty : your_profile.LastName));
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}
Vous utilisez ensuite une méthode d'extension to IIdentity
pour extraire les informations de l'identité des revendications:
public static ProfileName GetIdentityName(this IIdentity identity)
{
if (identity == null)
return null;
var first = (identity as ClaimsIdentity).FirstOrNull(ClaimTypes.GivenName),
var last = (identity as ClaimsIdentity).FirstOrNull(ClaimTypes.Surname)
return string.Format("{0} {1}", first, last).Trim();
}
internal static string FirstOrNull(this ClaimsIdentity identity, string claimType)
{
var val = identity.FindFirst(claimType);
return val == null ? null : val.Value;
}
Ensuite, dans votre application (dans votre contrôleur ou votre vue), vous pouvez simplement faire:
var name = User.Identity.GetIdentityName();
Vous pouvez mettre une valeur dans HttpContext.Current.Items. C'est le dictionnaire dont la durée de vie est une requête unique.
Vous pouvez l'utiliser comme ceci:
public static string CurrentScreenName
{
get
{
string screenName = (string)HttpContext.Current.Items["CurrentScreenName"];
if (string.NullOrEmpty(screenName))
{
screenName = ResolveScreenName();
HttpContext.Current.Items["CurrentScreenName"] = screenName;
}
return screenName;
}
}
Il n'exécutera ResolveScreenName () qu'une seule fois pour une requête unique.
Vous pouvez aussi créer une méthode d’extension pour accéder au nom d’écran depuis IIdentity.
public static class Extensions
{
public static string GetScreenName(this IIdentity identity)
{
return CurrentScreenName;
}
}
Et puis utilisez-le comme ceci:
string screenName = HttpContext.Current.User.Identity.GetScreenName();
Absolument! Vous devez créer votre propre type qui implémente à partir de IPrincipal
et prendre en charge la sécurité vous-même. Vous pouvez authentifier l'utilisateur lors d'une étape OWIN en définissant manuellement context.Request.User
.
J'ai trouvé une implémentation:
var profile = db.UserProfile.Where(u => u.UserId == user.Id).FirstOrDefault();
ProfileBase httpProfile = ProfileBase.Create(user.UserName);
httpProfile.SetPropertyValue("FullName", profile.FullName);
httpProfile.SetPropertyValue("FirstName", profile.FirstName);
httpProfile.SetPropertyValue("LastName", profile.LastName);
Puis pour plus tard ...
ProfileBase userProfile = ProfileBase.Create(HttpContext.User.Identity.Name);
var fullName = userProfile.GetPropertyValue("FullName"));