3

Windows認証を使用してVisual Studio 2015でasp.netコアプロジェクトを作成しました。アイデンティティにロールを追加する方法を理解できません。ASP.NETコアのWindows認証にロールを追加する方法

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

Windows認証に関連する具体的な例は見つかりませんでしたが、ドキュメントを読んでthis guideに行きました。そして私はまだ立ち往生しています。これは私がチェックするために使用するコードを働いている

+0

あなたが使用してステートメントを含むコードを表示することができます。今のところ、 'System.DirectoryServices'は参照していません。あなたがこれを行うと、比較的簡単に広告情報を得ることができます –

+0

@SimonPrice私は申し訳ありませんが表示されるコードはありません、それは動作しなかったので、私はすべての試みを廃止しました。しかし、Windows認証を有効にしたばかりの新しいプロジェクトだと思いますが、そこからは悲惨で苦しんでいるだけです。私は間違いなく 'System.DirectoryServices'を探し、ADとは何ですか? –

+0

ADはActive Directoryです。あなたが達成しようとしているプロジェクトのアイデアは何ですか? –

答えて

4

は、ユーザーである役割\グループである、役割は、Active Directoryではなく、データベースから来るのWindows認証であなたのレジャーで

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; 

    } 


} 



} 
+0

接続前または接続後にWindowsアカウントにロールを追加する方法を表示/説明できますか? –

+1

もし昨日私が20時00分に昨日送ったチャットリンクに入っていれば、今晩あなたと話すことができます –

7

を、それを使用してください。

クレーム変換を使用すると、リクエストごとにインバウンドIDを変更して、データベースから余分なロールを引き出すことができます。その後、

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

と現在の化身で何DIのサポートがないことを

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

ノートでそれを配線し、そのためだ場合、それがどこにある手動DIからデータベース情報を引き出す必要があるでしょう。

+0

関連するgithubに関する問題 - https://github.com/aspnet/Security/issues/863 – resnyanskiy

+3

@blowdartは.netcore 2.0でこれを動作させますか?私はUseClaimsTransformationを見つけられませんでした。 – user3885927

+0

このように見えるのは、2.0で少しオーバーホールされたようだ。 https://stackoverflow.com/questions/45709296/asp-net-core-2-0-claims-transformation-support-missingを参照してください。 –

0

興味のある人は、カスタムClaimsTransformerにEF DBContextを挿入してカスタムロール要求を追加する方法の簡単な例を示します。

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); 
    } 
} 
関連する問題