Безопасность на основе токенов с использованием AspNet.Security.OpenIdConnect.Server перестает работать после добавления удостоверения - PullRequest
0 голосов
/ 11 декабря 2018

Я создал небольшой веб-сайт .NET Core, который позволяет пользователю получать токен на предъявителя с помощью AspNet.Security.OpenIdConnect.Server.Он работает, как и ожидалось, до тех пор, пока я не добавлю services.AddDefaultIdentity<IdentityUser>();

. После добавления идентификатора журнал не показывает никаких признаков проверки токена, а HttpContext.User.Identity.IsAuthenticated всегда false.Токены все еще генерируются - кажется, что пропускается только проверка.

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddAuthentication(OAuthValidationDefaults.AuthenticationScheme)
        .AddOAuthValidation(OAuthValidationDefaults.AuthenticationScheme)
        .AddOpenIdConnectServer(options =>
        {
            options.TokenEndpointPath = "/token";
            options.AllowInsecureHttp = true;
            options.ApplicationCanDisplayErrors = true;

            options.Provider.OnValidateTokenRequest = context =>
            {
                context.Validate();

                return Task.CompletedTask;
            };

            options.Provider.OnHandleTokenRequest = context =>
            {
                var identity = new ClaimsIdentity(context.Scheme.Name,
                    OpenIdConnectConstants.Claims.Name,
                    OpenIdConnectConstants.Claims.Role);

                identity.AddClaim(OpenIdConnectConstants.Claims.Subject, "[unique id]");

                var ticket = new AuthenticationTicket(
                                    new ClaimsPrincipal(identity),
                                    new AuthenticationProperties(),
                                    context.Scheme.Name);

                context.Validate(ticket);

                return Task.CompletedTask;
            };
        });

    // When the following line is uncommented the bearer token isn't validated anymore
    //services.AddDefaultIdentity<IdentityUser>();

    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseDeveloperExceptionPage();

    app.UseAuthentication();

    app.UseStaticFiles();

    app.UseMvc();
}

Пример действий контроллера может быть таким:

public bool Get() => HttpContext.User.Identity.IsAuthenticated;

, и если я добавлю атрибут Authorize I 'Я получу 404:

[Authorize]
public bool Get() => HttpContext.User.Identity.IsAuthenticated;

Чтобы создать токен, я делаю что-то вроде этого:

POST http://localhost:5005/token HTTP/1.1
User-Agent: Fiddler
Host: localhost:5005
Content-Length: 69
Content-Type: application/x-www-form-urlencoded

client_id=web&grant_type=password&username=username&password=password

И запрос с токеном-носителем выглядит так:

GET http://localhost:5005/customer HTTP/1.1
User-Agent: Fiddler
Host: localhost:5005
Authorization: Bearer <the token received in the previous call>

Всю программу можно скачать здесь: https://gist.github.com/nielslbeck/e454cc1b79aa56948c96f4a24438b34e

...