Azure AD и авторизация на основе группы с токеном в веб-API - PullRequest
0 голосов
/ 13 декабря 2018

В моем Azure AD есть пользователь и группа.Я хочу предоставить пользователям доступ в соответствии с группой, к которой они принадлежат.

Я успешно внедрил ее в приложении ASP.NET MVC.Как настроить групповые заявки:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
        .AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    services.AddSpaStaticFiles(c => { c.RootPath = "ClientApp/dist";});

     services.AddAuthorization(options =>
    {
        options.AddPolicy("Admins",
            policyBuilder =>
            {
                policyBuilder.RequireClaim("groups",
                    Configuration.GetValue<string>("AzureSecurityGroup:AdminObjectId"));
            });
    });

    services.AddAuthorization(options =>
    {
        options.AddPolicy("Employees",
            policyBuilder =>
            {
                policyBuilder.RequireClaim("groups",
                    Configuration.GetValue<string>("AzureSecurityGroup:EmployeeObjectId"));
            });
    });

    services.AddAuthorization(options =>
    {
        options.AddPolicy("Managers",
            policyBuilder => policyBuilder.RequireClaim("groups", Configuration.GetValue<string>("AzureSecurityGroup:ManagerObjectId")));
    });

    services.Configure<AzureADOptions>(Configuration.GetSection("AzureAd"));
}

И если я хочу ограничить доступ пользователя без прав администратора к странице контактов, я делаю это:

public class HomeController : Controller
{
    [Authorize(Policy = "Admins")]
    public IActionResult Contact()
    {
        ViewData["Message"] = "Your contact page.";

        return View();
    }
}

Это работает. Теперь идеясоздать контроллер веб-API и ограничить доступ к некоторым из метода.

//[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] {"value1", "value2"};
    }

    // GET api/values/5
    [Authorize(Policy = "Admins")]
    [HttpGet("{id}")]
    public ActionResult<string> Get(int id)
    {
        return "value";
    }
}

Я пользуюсь почтальоном.Я получаю токен доступа:

POST https://login.microsoftonline.com/{tenant_id}/oauth2/token

, затем отправляю

GET https://localhost/api/values/1

с заголовком Авторизация и значением Носитель {токен} , но получить Несанкционированный доступ (401).(Незащищенный https://localhost/api/values работает, как и ожидалось).Я подозреваю, что передал неверный токен, проверяю его на https://jwt.io/ и он не содержит информацию о группе, к которой принадлежит пользователь.Должен ли я настроить его в коде по-другому?Спасибо

Обновление 1 (декодированный токен):

{
  "typ": "JWT",
  "alg": "RS256",
  "x5t": "nbCwW11w3XkB-xUaXwKRSLjMHGQ",
  "kid": "nbCwW11w3XkB-xUaXwKRSLjMHGQ"
}.{
  "aud": "00000002-0000-0000-c000-000000000000",
  "iss": "https://sts.windows.net/xxxxxxxx-1835-453d-a552-28feda08393e/",
  "iat": 1544770435,
  "nbf": 1544770435,
  "exp": 1544774335,
  "aio": "42RgYPjkVuw2Z/fJtp+RF/mUp7Z5AQA=",
  "appid": "963418bb-8a31-4c47-bc91-56b6e51181dc",
  "appidacr": "1",
  "idp": "https://sts.windows.net/xxxxxxxx-1835-453d-a552-28feda08393e/",
  "oid": "0dfb0f07-b6e1-4318-ba33-066e1fc3c0ac",
  "sub": "0dfb0f07-b6e1-4318-ba33-066e1fc3c0ac",
  "tenant_region_scope": "EU",
  "tid": "xxxxxxxx-1835-453d-a552-28feda08393e",
  "uti": "cxlefO0ABkimo2z-7L0IAA",
  "ver": "1.0"
}.[Signature]

1 Ответ

0 голосов
/ 14 декабря 2018

При использовании grant_type - client_credentials, это означает, что вы используете поток учетных данных клиента для получения токена доступа для доступа к ресурсу:

https://docs.microsoft.com/en-us/azure/active-directory/develop/v1-oauth2-client-creds-grant-flow

Поток предоставления учетных данных клиента OAuth 2.0 позволяет веб-службе (конфиденциальному клиенту) использовать свои учетные данные вместо того, чтобы выдавать себя за пользователя, для аутентификации при вызове другой веб-службы.В этом случае клиентом обычно является веб-служба среднего уровня, служба демона или веб-сайт.

В этом сценарии клиент использует свои учетные данные вместо того, чтобы выдавать себя за пользователя, в этот сценарий информация о пользователе / ​​идентификация пользователя не включается.Вы должны использовать Code Grant Flow для авторизации доступа к веб-приложениям и веб-API с использованием идентификатора пользователя:

https://docs.microsoft.com/en-us/azure/active-directory/develop/v1-protocols-oauth-code

...