【发布时间】:2017-08-31 05:10:42
【问题描述】:
我正在尝试创建一个相当简单的 Intranet 应用程序,该应用程序将使用 Active Directory 进行身份验证,并将使用 AspNetRoles 表来检查用户是否处于某个应用程序角色中。这个应用程序只是一个内部彩票,一些用户可以在其中创建活动/比赛,然后其他用户可以提交参赛作品。我正在考虑从 2 个基本角色开始:
- 管理员 - 可以对“事件”执行 CRUD 操作或 “竞赛”实体
- 参赛者 - 可以执行 GET 操作 “竞赛”实体,并且可以创建新的“参赛”实体。
这就是我卡住的地方:我已经让 Windows 身份验证工作,因为我可以从控制器执行 User.Identity.Name 并查看我的域登录名。此外,我可以通过User.IsInRole("Domain Users") 验证帐户是否属于域组。如果我想避免为我的应用程序中的每个角色创建新的 AD 组(假设未来的设计更改需要额外的角色),我如何使用控制器上的授权来检查应用程序角色?
这是我要使用的示例控制器:
[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");
}
}
}
在我的 Startup.cs 中,在 ConfigureServices 中,我按如下方式连接 Identity:
services.AddIdentity<RaffleUser, ApplicationRole>()
.AddEntityFrameworkStores<RaffleContext>();
我的 RaffleUser 类实际上只是 IdentityUser 的默认实现:
public class RaffleUser : IdentityUser
{
}
我的 ApplicationRole 类也只是 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。我需要一些中间件类来为我做这件事吗?这是否是使授权可在所有控制器上重复使用的最佳方式?
【问题讨论】:
标签: authentication asp.net-core asp.net-core-mvc asp.net-core-webapi asp.net-core-identity