web-dev-qa-db-fra.com

Pouvez-vous étendre les propriétés HttpContext.Current.User.Identity

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.

9
user2330270

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();
17
Brendan Green

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();
3
Piotr Dory

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.

0
David Pfeffer

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"));
0
user2330270