私は、認証にActive Directoryを使用するかなり単純なイントラネットアプリケーションを作成しようとしており、AspNetRolesテーブルを使用して、ユーザーが特定のアプリケーションロールにいるかどうかを確認します。このアプリは、一部のユーザーがイベント/コンテストを作成して、他のユーザーがコンテストにエントリーを提出することができる社内宝くじです。 、 「コンテスト」の実体にGET操作を行うことができます - 「イベント」または 「コンテスト」の実体 ASP.NETコアWindowsの認証とアプリケーションのロール
- 管理者:私は2つの基本的な役割で出始めと思っています新しい「エントリ」エンティティを作成することができます。
ここで私は固執しています:Windows認証は、コントローラからは、私がUser.Identity.Name
を実行し、私のドメインログイン名を見ることができるという意味で働いています。さらに、User.IsInRole("Domain Users")
を実行して、アカウントがドメイングループに所属していることを確認できます。アプリケーションの役割ごとに新しいADグループを作成したくない場合(道路の設計変更で追加の役割が必要になった場合)、コントローラで承認を使用してアプリケーションの役割を確認するにはどうすればよいですか?ここで
は、私が使用したいコントローラ例です:次のように私のStartup.csで
[Route("api/[controller]")]
[Authorize(Roles = "Contestant")]
public class EventTypesController : Controller
{
private IRaffleRepository _repository;
private ILogger<EventTypesController> _logger;
public EventTypesController(IRaffleRepository repository, ILogger<EventTypesController> logger)
{
_repository = repository;
_logger = logger;
}
[HttpGet("")]
public IActionResult Get()
{
try
{
var results = _repository.GetAllEventTypes();
return Ok(Mapper.Map<IEnumerable<EventTypeViewModel>>(results));
}
catch (Exception ex)
{
_logger.LogError($"Failed to get all event types: {ex}");
return BadRequest("Error occurred");
}
}
}
、ConfigureServicesで、私はアイデンティティをアップ配線しています:
services.AddIdentity<RaffleUser, ApplicationRole>()
.AddEntityFrameworkStores<RaffleContext>();
マイRaffleUserクラスが実際にありますIdentityUserのデフォルトの実装:
public class RaffleUser : IdentityUser
{
}
My ApplicationRole cla ssはIdentityRoleのデフォルト実装です。私もシードクラスにいくつかのデータを播種してみました:
if (!await _roleManager.RoleExistsAsync("Administrator"))
{
var adminRole = new ApplicationRole()
{
Name = "Administrator"
};
await _roleManager.CreateAsync(adminRole);
await _context.SaveChangesAsync();
}
if (await _userManager.FindByNameAsync("jmoor") == null)
{
using (var context = new PrincipalContext(ContextType.Domain))
{
var principal = UserPrincipal.FindByIdentity(context, "DOMAIN\\jmoor");
if (principal != null)
{
var user = new RaffleUser()
{
Email = principal.EmailAddress,
UserName = principal.SamAccountName
};
await _userManager.CreateAsync(user);
await _context.SaveChangesAsync();
var adminRole = await _roleManager.FindByNameAsync("Administrator");
if (adminRole != null)
{
await _userManager.AddToRoleAsync(user, adminRole.Name);
await _context.SaveChangesAsync();
}
}
}
}
データをテーブルにしますが、それは単にコントローラレベルでのように思える、私はIdentityUserに認証されたユーザーを変換する必要があります。私のためにこれを行うためにミドルウェアクラスが必要ですか?それがすべてのコントローラで許可を再利用できるようにする最良の方法でしょうか?
oops。あなたの質問の日付が見えませんでした。私はあなたがそれをずっと前に解決したことを願っている – Peter
私はすべてのコントローラを徹底的にテストしていませんが、これは私が探していたものを達成するように見えます。私は、新しいポリシーベースの認証を使用している、私が思いついた代替案を投稿します。 –