Dotnet Core 2.2 - аутентификация Azure AD работает, но база ролей возвращает отказ в доступе - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь заставить роли работать в .Net Core 2.2, и ни одно из других решений не сработало.

В Startup.cs Microsoft генерирует этот код в новом .Net 2.2, который не 'по какой-то причине не работает, но заставить этот блок работать не в тему, хотя было бы неплохо узнать, почему это не так.Говорит, что «не был указан AuthenticationScheme, и не найден DefaultChallengeScheme».Но это то, что сгенерировано Microsoft.

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
                .AddAzureAd(options => Configuration.Bind("AzureAd", options));

В моем реальном Startup.cs мне пришлось использовать то, что ниже

services.AddAuthentication(sharedOptions =>
            {
                sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            })
            .AddAzureAd(options => Configuration.Bind("AzureAd", options))
            .AddCookie();

Так что вышеизложенное - единственный способ, которым я получилAzure AD для работы с атрибутом [Authorize].Проблема в том, что когда я пытаюсь авторизоваться с ролями.Я попробовал многие из предложений, но не имел никакого успеха.Каждый раз, когда у меня появляется [Authorize(Roles="")], меня перенаправляют на метод AccessDenied() в AccountController, который Microsoft сгенерировал для Azure AD, в основном Access Denied.Я использую роли, которые я сделал в AD, а также создал группу в Azure AD, также использующую роль под названием «Пользователи домена», которая в основном предоставляется каждому сотруднику в компании и является самой базовой авторизацией, которую имеет каждый сотрудник.,Если «Пользователи домена» получают «Отказано в доступе», тогда я понятия не имею, что я здесь не понимаю.

Я следовал документации Microsoft для ролей, но там нет ничего, что говорило бы, что мне нужно добавить больше кservices.AddAuthentication() варианты.

Ответы [ 3 ]

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

Сначала подтвердите, что вы получаете группы в токене. После изменения значения «groupMembershipClaims» в манифесте на «Все», вы можете поместить следующий код в контроллер:

 var claims = User.Claims;

После аутентификации пользователяв приложении вы должны получить groups претензии:

enter image description here

Затем вы можете использовать атрибут с именованной политикой, а затем определять политику при запускетребовать утверждения группы и устанавливать разрешенный идентификатор группы:

services.AddAuthorization(options =>
{
    options.AddPolicy(
        "CanAccessGroup",
        policyBuilder => policyBuilder.RequireClaim("groups", "0c71eab2-6618-4c53-bcce-806xxxxxx"));
});

В контроллере:

[Authorize(Policy = "CanAccessGroup")]
public IActionResult About()
{
    return View();
}

Если идентификатор группы отсутствует в утверждениях группы пользователей, доступ будет запрещен.

Говорит, что «схема аутентификации не указана, и не найден DefaultChallengeScheme».Но это то, что сгенерировано Microsoft.

Я не встретил эту ошибку, если при использовании шаблона Work or School Accounts по умолчанию в VS2017 установленная версия пакета Microsoft.AspNetCore.Authentication.AzureAD.UI будет v2.2.0,и сгенерированные коды:

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
    .AddAzureAD(options => Configuration.Bind("AzureAd", options));
0 голосов
/ 20 марта 2019

Вот что у меня работает, .Net Core 2.2 Web App с использованием ролей.

Отредактированный манифест приложения для включения ролей, например

"appRoles": [
        {
            "allowedMemberTypes": [
                "User"
            ],
            "description": "Admins have the power.",
            "displayName": "Admin",
            "id": "282fc418-cf3a-4a3a-89f8-6500c64695ff",
            "isEnabled": true,
            "lang": null,
            "origin": "Application",
            "value": "Admin"
        },
        {
            "allowedMemberTypes": [
                "User"
            ],
            "description": "Writers have the ability to edit app data.",
            "displayName": "Writer",
            "id": "3aa1a322-2918-4005-8cc3-51cba010ccc0",
            "isEnabled": true,
            "lang": null,
            "origin": "Application",
            "value": "Writer"
        },
        {
            "allowedMemberTypes": [
                "User"
            ],
            "description": "Readers have the ability to read app data.",
            "displayName": "Reader",
            "id": "239f93af-4cc0-4d0e-ad04-bda1f8ac2a91",
            "isEnabled": true,
            "lang": null,
            "origin": "Application",
            "value": "Reader"
        }
    ]

Startup.cs

services.AddAuthentication(sharedOptions =>
    {
        sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
    })
    .AddAzureAd(options => Configuration.Bind("AzureAd", options))
    .AddCookie();

services.AddHttpContextAccessor();

Добавьте расширения, чтобы обойти упомянутую проблему, в своем «верхнем блоке» кода.

AzureAdAuthenticationBuilderExtensions.cs

public static class AzureAdAuthenticationBuilderExtensions
{
    public static AuthenticationBuilder AddAzureAd(this AuthenticationBuilder builder)
        => builder.AddAzureAd(_ => { });

    public static AuthenticationBuilder AddAzureAd(this AuthenticationBuilder builder, Action<AzureAdOptions> configureOptions)
    {
        builder.Services.Configure(configureOptions);
        builder.Services.AddSingleton<IConfigureOptions<OpenIdConnectOptions>, ConfigureAzureOptions>();
        builder.AddOpenIdConnect();
        return builder;
    }

    private class ConfigureAzureOptions : IConfigureNamedOptions<OpenIdConnectOptions>
    {
        private readonly AzureAdOptions _azureOptions;

        public ConfigureAzureOptions(IOptions<AzureAdOptions> azureOptions)
        {
            _azureOptions = azureOptions.Value;
        }

        public void Configure(string name, OpenIdConnectOptions options)
        {
            options.ResponseType = "token id_token";
            options.Resource = _azureOptions.TargetApiAppId;
            options.SaveTokens = true;
            options.ClientId = _azureOptions.ClientId;
            options.Authority = $"{_azureOptions.Instance}{_azureOptions.TenantId}";
            options.UseTokenLifetime = true;
            options.CallbackPath = _azureOptions.CallbackPath;
            options.RequireHttpsMetadata = false;
        }

        public void Configure(OpenIdConnectOptions options)
        {
            Configure(Options.DefaultName, options);
        }
    }
}

AzureADOptions.cs

public class AzureAdOptions
{
    public string ClientId { get; set; }
    public string ClientSecret { get; set; }
    public string Instance { get; set; }
    public string Domain { get; set; }
    public string TenantId { get; set; }
    public string CallbackPath { get; set; }

    //manually added
    public string TargetApiAppId { get; set; }
}

Назначьте роль пользователю в блейде корпоративных приложений:

enter image description here

Украсьте свой контроллер:

[Authorize(Roles = "Writer")]

AccountController.cs

public class AccountController : Controller
{
    [HttpGet]
    public IActionResult SignIn()
    {
        var redirectUrl = Url.Action(nameof(HomeController.Index), "Home");
        return Challenge(
            new AuthenticationProperties { RedirectUri = redirectUrl },
            OpenIdConnectDefaults.AuthenticationScheme);
    }

    [HttpGet]
    public IActionResult SignOut()
    {
        var callbackUrl = Url.Action(nameof(SignedOut), "Account", values: null, protocol: Request.Scheme);
        return SignOut(
            new AuthenticationProperties { RedirectUri = callbackUrl },
            CookieAuthenticationDefaults.AuthenticationScheme,
            OpenIdConnectDefaults.AuthenticationScheme);
    }

    [HttpGet]
    public IActionResult SignedOut()
    {
        if (User.Identity.IsAuthenticated)
        {
            // Redirect to home page if the user is authenticated.
            return RedirectToAction(nameof(HomeController.Index), "Home");
        }

        return View();
    }

    [HttpGet]
    public IActionResult AccessDenied()
    {
        return View();
    }
}
0 голосов
/ 27 февраля 2019

Необходимо настроить манифест приложения в AzureAD для получения ролей AD.

Измените значение «groupMembershipClaims» в манифесте на «Все».

Обратите внимание, что если у вас естьбольшое количество групп может привести к тому, что ответ станет слишком большим, поэтому все могут захотеть сократить только те группы, которые вы действительно хотите передать.

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