Указание Windows AuthenticationScheme и ролей не работает - PullRequest
0 голосов
/ 26 февраля 2019

Как мне указать, что AuthenticationScheme равно Windows, и проверить, что пользователь является членом группы AD?

Когда я указываю AuthenticationScheme, установка Roles больше не требуетсяработает, а почему нет?И как мне это исправить?

public class SomeController : Controller
{
    //this works
    [Authorize(Roles = @"SOME.DOMAIN\SOME GROUP")]
    public IActionResult SomeAction(){ ... }

    //this works
    [Authorize(AuthenticationSchemes = "Windows")]
    //this doesn't work
    //[Authorize(Roles = @"SOME.DOMAIN\SOME GROUP", AuthenticationSchemes = "Windows")]
    public ActionResult SomeAction2(){ ... }
}

Полный пример на GitHub


Некоторый фон

Мыиметь группу AD с именем SOME GROUP, членом которой должен быть пользователь, для выполнения определенных действий.В других частях веб-приложения мы используем куки-аутентификацию, поэтому мне нужно указать метод аутентификации в этом конкретном контроллере.

Ссылка: Авторизоваться по определенной схеме в ASP.NET Core

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Оказывается, WindowsIdentity сохраняется в объекте HttpContext.User, что позволяет нам проверять членство в группе / роли.

Встроенный пример

using System.Security.Principal;

[Authorize(AuthenticationSchemes = IISServerDefaults.AuthenticationScheme)]
public ActionResult SomeAction()
{
    var windowsIdentity = HttpContext.User.Identity as WindowsIdentity;
    var windowsUser = new WindowsPrincipal(windowsIdentity);
    var role = "[MY-COMPUTER-NAME || AD GROUP NAME]\\[GROUP NAME]";
    var inInRole = windowsUser.IsInRole(role);

    // todo: if not allowed write code to handle it

    return View();
}

Полный источник


Пример политики

//AuthorizationHandler<T>
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RoleRequirement requirement)
{
    if (!(context.User.Identity is WindowsIdentity windowsIdentity))
        return Task.CompletedTask;

    var windowsUser = new WindowsPrincipal(windowsIdentity);
    try
    {
        var hasRole = windowsUser?.IsInRole(requirement.GroupName) ?? false;
        if (hasRole)
            context.Succeed(requirement);
    }
    catch (Exception ex)
    {
        logger.LogError(ex, "Unable to check groups the user belongs too");
    }

    return Task.CompletedTask;
}

//IAuthorizationRequirement
public class RoleRequirement : IAuthorizationRequirement
{
    public RoleRequirement(string groupName)
    { GroupName = groupName; }

    /// <summary>
    /// The Windows / AD Group Name that is allowed to call the OMS API
    /// </summary>
    public string GroupName { get; }
}

//action protected with the policy
[Authorize("Super User Role")]
public IActionResult Contact()
{ return View(); }

//startup.cs
public void ConfigureServices(IServiceCollection services)
{
    //pull group name from the config
    var securityOptions = Configuration.GetSection("Security").Get<SecurityOptions>();

    services.AddAuthentication(IISDefaults.AuthenticationScheme);
    services.AddAuthorization(options =>
    {
        options.AddPolicy("Super User Role", policy =>
        {
            policy.Requirements.Add(new RoleRequirement(securityOptions.AllowedGroup));
            policy.AddAuthenticationSchemes("Windows");
        });
    });
    services.AddSingleton<IAuthorizationHandler, RoleHandler>();
    // ...
}

Полный источник

0 голосов
/ 26 февраля 2019

Аутентификация Windows отличается от всех других обработчиков аутентификации.ASP.NET не выполняет аутентификацию, а компонент Windows - и передает ASP.NET Core дескриптор созданной им идентичности.Он не предназначен или не предназначен для смешивания с другими типами аутентификации, это либо Windows и Anonymous, либо просто Windows.

Смешивание с чем-либо другим не поддерживается, поэтому вам никогда не нужно ограничивать по схеме, даже если это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...