web-dev-qa-db-ja.com

ASP.NET CoreでWindows認証にロールを追加する方法

Visual Studio 2015でWindows認証を使用してasp.netコアプロジェクトを作成しました。 Identityにロールを追加する方法がわかりません。

Windowsアカウントのユーザー名のテーブルがあります。ユーザーがWebサイトを開くと、ユーザーがIDに追加され(User.Identity.Nameでユーザー名を表示できるため、そうなります)、別のテーブルからロールを引き出してユーザーに割り当てます、これは可能ですか?それとも、もっと良い方法がありますか? (なぜ、どのように?)

Windows認証に関連する特定の例を見つけることができませんでしたが、ドキュメントを読んで このガイド を確認しました。そして、私はまだ行き詰まっています。

10
Anton Toshik

これは、ユーザーが役割グループに属しているかどうかを確認するために使用する作業コードです。自由に使用してください

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

Windows認証では、ロールはデータベースではなくActive Directoryから取得されます。

Claims Transformationを使用して、リクエストごとにインバウンドIDを変更し、データベースから追​​加のロールをプルすることができます。

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

それからそれを配線します

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

現在のインカネーションではDIサポートがないため、データベース情報がある場合は、DIからデータベース情報を手動でプルする必要があることに注意してください。

11
blowdart

興味のある方のために、EF DBContextをカスタムClaimsTransformerに挿入し、カスタムロールクレームを追加する簡単な例を示します。

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