2017-08-20 3 views
0

Je suis nouveau sur la plate-forme asp net boilerplate, et j'ai créé une nouvelle application web multipage de projet mvc, sans module zéro.ASP NET Boilerplate, Login enregistré dans ABPSession

Je voudrais utiliser la classe AbpSession qui, d'après ce que je comprends, se trouve dans l'ID utilisateur qui est pris en charge par Thread.CurrentPrincipal.

Cependant, je ne comprends pas comment faire après la connexion, pour enregistrer l'ID utilisateur dans le Thread.CurrentPrincipal.

J'ai cherché dans le réseau et trouvé plusieurs solutions, mais dans la classe AbpSession l'ID d'utilisateur est toujours nul.

La solution la plus optimale que j'ai trouvé ceci:

IList<Claim> claimCollection = new List<Claim> 
{ 
     new Claim(AbpClaimTypes.UserId, "5") 
}; 
ClaimsIdentity claimsIdentity = new ClaimsIdentity(claimCollection); 
var principal = new ClaimsPrincipal(claimsIdentity); 
Thread.CurrentPrincipal = principal; 

C'est la première fois que je l'utilise principal et l'identité et en dépit d'être documenté, je ne comprends pas bien comment les utiliser avec asp boilerplate net, et je l'ai pas trouver de codes d'échantillons. Savez-vous comment me dire le bon chemin ou me dire où trouver des codes fonctionnels?

Merci

Répondre

0

Altough la question est très générale, je voudrais vous partager un peu de code sur la façon d'ajouter le champ personnalisé à AbpSession dans ASP.NET base.

MyAppSession.cs

//Define your own session and add your custom field to it 
//Then, you can inject MyAppSession and use it's new property in your project. 
public class MyAppSession : ClaimsAbpSession, ITransientDependency 
{ 
    public MyAppSession(
     IPrincipalAccessor principalAccessor, 
     IMultiTenancyConfig multiTenancy, 
     ITenantResolver tenantResolver, 
     IAmbientScopeProvider<SessionOverride> sessionOverrideScopeProvider) : 
     base(principalAccessor, multiTenancy, tenantResolver, sessionOverrideScopeProvider) 
    { 

    } 

    public string UserEmail 
    { 
     get 
     { 
      var userEmailClaim = PrincipalAccessor.Principal?.Claims.FirstOrDefault(c => c.Type == "Application_UserEmail"); 
      if (string.IsNullOrEmpty(userEmailClaim?.Value)) 
      { 
       return null; 
      } 

      return userEmailClaim.Value; 
     } 
    } 
} 

UserClaimsPrincipalFactory.cs

//Override CreateAsync method to add your custom claim 
public override async Task<ClaimsPrincipal> CreateAsync(User user) 
{ 
    var claim = await base.CreateAsync(user); 
    claim.Identities.First().AddClaim(new Claim("Application_UserEmail", user.EmailAddress)); 
    return claim; 
}