401 только с токеном на предъявителя. NET Core 3.1 с использованием Azure AD - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь внедрить аутентификацию токена Bearer (только) в. NET Core 3.1 API, используя Azure AD.

Я могу получить токен из Azure AD после проверки authorization_code, и браузер отправляет обратно на мой URL перенаправления со следующим:

{"token_type":"Bearer","scope":"User.Read","expires_in":3600,"ext_expires_in":3600,"access_token":"EwBwA8l6...SzT3qoxGbSMg=="} (сокращенно)

Как только я получу этот токен, смогу ли я использовать [Authorize] атрибут прямо на моих API и запросить с помощью токена Bearer в шапке? Когда я это делаю, я получаю ответ 401.

У меня есть это в моем ConfigureServices():

services.AddAuthentication(options =>
{
    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    options.Audience = "<guid>";

    options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
    {
        ValidateIssuerSigningKey = false,
        ValidateAudience = false,
        ValidateIssuer = false,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("abc123")),
        TokenDecryptionKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("abc123"))
    };
});
services.AddControllers();

И в Configure() у меня есть:

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseCookiePolicy();
app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});

В моем журнале ошибок отображается сообщение:

«Носитель» не был аутентифицирован. Сообщение об ошибке: «SecurityTokenValidator недоступен для токена

Я перепробовал множество комбинаций настроек в Startup.cs, и независимо от того, что я могу получить только 401 при вызове моего API из Почтальон. Я могу получить аутентификацию Cook ie, работающую с примерами кода, которые я нашел в Интернете, но я этого не хочу.

Проблема в том, что токен зашифрован? использовать неправильный токен? Или есть какая-то другая проблема? Нужно ли мне настроить приложение в моем приложении с таблицами базы данных для AspNetUser, et c.?

Короче, я просто пытаюсь сгенерируйте токен Bearer, используя Azure AD в качестве поставщика аутентификации, и сделайте вызовы к моим API, передав заголовок токена Bearer.

1 Ответ

1 голос
/ 28 апреля 2020

Похоже, вы пытаетесь использовать токен Microsoft Graph API в своем API. (на основе этого: "scope":"User.Read")

Ваше интерфейсное приложение должно использовать область для вашего API, а не User.Read. Таким образом, он получит токен доступа, предназначенный для вашего API. Зарегистрируйте область при регистрации приложения API через раздел Expose a API и используйте полное значение области в вашем интерфейсе при получении токена.

Для вашего фонового интерфейса требуется следующая конфигурация:

.AddJwtBearer(options =>
{
    // add v2.0 to the end if your API is set to get v2 tokens in its manifest
    options.Authority = "https://login.microsoftonline.com/your-aad-tenant-id";
    options.Audience = "your-api-client-id";
});

Это должна быть минимальная конфигурация, необходимая для аутентификации. Посмотрит ключи подписи и др. c. автоматически из органа при запуске.

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