Доступ к API через токен из Auth0 - PullRequest
       35

Доступ к API через токен из Auth0

0 голосов
/ 03 сентября 2018

Я внедряю Auth0 для использования в моем приложении ASP.NET Core 2.1 с интерфейсом React и не смог сделать вызовы API с использованием токена, полученного из Auth0. Я продолжаю получать несанкционированную ошибку.

Вот код в ConfigureServices() методе в моем Startup.cs:

services.AddAuthentication(options => {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
  .AddJwtBearer(jwtOptions => {
      jwtOptions.Authority = "https://myapp.auth0.com/";
      jwtOptions.Audience = "https://myapp.com/api/";
   });

   string domain = $"https://myapp.auth0.com/";
   services.AddAuthorization(options =>
   {
      options.AddPolicy("read:data", policy => policy.Requirements.Add(new HasScopeRequirement("read:data", domain)));
   });

services.AddSingleton<IAuthorizationHandler, HasScopeHandler>();

У меня есть следующее для обработки области:

public class HasScopeRequirement : IAuthorizationRequirement
{
   public string Issuer { get; }
   public string Scope { get; }

   public HasScopeRequirement(string scope, string issuer)
   {
       Scope = scope ?? throw new ArgumentNullException(nameof(scope));
       Issuer = issuer ?? throw new ArgumentNullException(nameof(issuer));
   }
}

public class HasScopeHandler : AuthorizationHandler<HasScopeRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, HasScopeRequirement requirement)
    {
        // If user does not have the scope claim, get out of here
        if (!context.User.HasClaim(c => c.Type == "scope" && c.Issuer == requirement.Issuer))
           return Task.CompletedTask;

        // Split the scopes string into an array
        var scopes = context.User.FindFirst(c => c.Type == "scope" && c.Issuer == requirement.Issuer).Value.Split(' ');

        // Succeed if the scope array contains the required scope
        if (scopes.Any(s => s == requirement.Scope))
            context.Succeed(requirement);

        return Task.CompletedTask;
    }
}

Кроме того, в методе Configure() у меня есть app.UseAuthentication();

Вот код в моей auth0.js службе:

auth0 = new auth0.WebAuth({
        domain: 'myapp.auth0.com',
        clientID: 'client_id_copied_from_application_settings_on_auth0',
        redirectUri: 'http://localhost:49065/member/callback',
        audience: 'https://myapp.com/api/',
        responseType: 'token id_token',
        scope: 'openid'
    });

Мой интерфейс успешно получает access_token, expires_at и id_token. Используя Почтальон, я вызываю API для одного из моих методов API, но получаю ошибку 401 Unauthorized. Я публикую скриншот того, что я вижу в Почтальоне ниже. Похоже, зрителям это не нравится.

enter image description here

Есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 04 сентября 2018

Мы в Auth0 составили серию учебных пособий по этому блогу, используя .Net Core 2.0, которые могут быть полезны для отслеживания.

https://auth0.com/blog/developing-web-apps-with-asp-dot-net-core-2-dot-0-and-react-part-1/

...