web-dev-qa-db-fra.com

Comment ajouter des rôles à l'authentification Windows dans ASP.NET Core

J'ai créé un projet principal asp.net dans Visual Studio 2015 avec authentification Windows. Je ne peux pas comprendre comment ajouter des rôles à l'identité.

J'ai une table avec des noms d'utilisateur pour le compte Windows. Et lorsque l'utilisateur ouvre le site Web, l'utilisateur est ajouté à l'identité (je suppose que c'est ce qui se produit, car je peux afficher le nom d'utilisateur par User.Identity.Name) et je veux retirer les rôles d'une autre table et les affecter à l'utilisateur , Est-ce possible? Ou peut-être existe-t-il une meilleure façon de procéder? (Pourquoi comment?)

Je n'ai pas trouvé d'exemples d'exemples spécifiques liés à l'authentification Windows, mais j'ai lu la documentation et parcouru ce guide . Et je suis toujours coincé.

10
Anton Toshik

c'est du code de travail que j'utilise pour vérifier si un utilisateur est dans un rôle\groupe, veuillez l'utiliser à votre guise

using System.Collections.Generic;
using System.DirectoryServices.AccountManagement;
using System.Linq;
using System.Security.Principal;

namespace Santander.IsUserInGroupOrRole_cs
{

public class IsUserInRole
{
    public static bool IsInGroup(string groupName)
    {
        var myIdentity = GetUserIdWithDomain();
        var myPrincipal = new WindowsPrincipal(myIdentity);
        return myPrincipal.IsInRole(groupName);
    }

    public bool IsInGroup(List<string> groupNames)
    {
        var myIdentity = GetUserIdWithDomain();
        var myPrincipal = new WindowsPrincipal(myIdentity);

        return groupNames.Any(group => myPrincipal.IsInRole(group));
    }

    public static WindowsIdentity GetUserIdWithDomain()
    {
        var myIdentity = WindowsIdentity.GetCurrent();
        return myIdentity;
    }

    public static string GetUserId()
    {
        var id = GetUserIdWithDomain().Name.Split('\\');
        return id[1];
    }

    public static string GetUserDisplayName()
    {
        var id = GetUserIdWithDomain().Name.Split('\\');

        var dc = new PrincipalContext(ContextType.Domain, id[0]);
        var adUser = UserPrincipal.FindByIdentity(dc, id[1]);
        return adUser.DisplayName;

    }
}
}
5
Simon Price

Avec l'authentification Windows, les rôles proviennent d'Active Directory, pas d'une base de données.

Vous pouvez utiliser la transformation des revendications pour modifier l'identité entrante à chaque demande afin d'extraire des rôles supplémentaires de votre base de données.

public class ClaimsTransformer : IClaimsTransformer
{
    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        ((ClaimsIdentity)principal.Identity).AddClaim(
            new Claim("ExampleClaim", "true"));
        return Task.FromResult(principal);
    }
}

Et puis connectez-le avec

app.UseClaimsTransformation(new ClaimsTransformationOptions
{
    Transformer = new ClaimsTransformer()
});

Notez que dans l'incarnation actuelle, il n'y a pas de support DI, vous devrez donc retirer manuellement vos informations de base de données de DI si c'est là que cela se trouve.

11
blowdart

Pour toute personne intéressée, voici un exemple simple de la façon dont vous pouvez injecter un EF DBContext dans un ClaimsTransformer personnalisé et ajouter des revendications de rôle personnalisées.

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
  services.AddScoped<IClaimsTransformer, MyClaimsTransformer>();

  services.AddMvc();

  services.AddDbContext<MyDbContext>(options => options.UseSqlServer(
      Configuration.GetConnectionString("MyConnStringSetting")
    ));

  (...)
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
  app.UseClaimsTransformation(context =>
  {
    var transformer = context.Context.RequestServices.GetRequiredService<IClaimsTransformer>();
    return transformer.TransformAsync(context);
  });

  (...)
}

MyClaimsTransformer.cs

public class MyClaimsTransformer : IClaimsTransformer
{
  private readonly MyDbContext _context;

  public MyClaimsTransformer(MyDbContext context)
  {
    _context = context;
  }

  public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context)
  {
    var identity = (ClaimsIdentity)context.Principal.Identity;
    var userName = identity.Name;
    var roles = _context.Role.Where(r => r.UserRole.Any(u => u.User.Username == userName)).Select(r => r.Name);
    foreach (var role in roles)
    {
      var claim = new Claim(ClaimTypes.Role, role);
      identity.AddClaim(claim);
    }
    return Task.FromResult(context.Principal);
  }
}
3
DanO