Интеграционное тестирование IdentityServer4 с хранилищами InMemory - PullRequest
0 голосов
/ 19 января 2019

Я пишу интеграционный тест для аутентификации и авторизации моих микросервисов. Я использую IdentityServer4 с хранилищами в памяти, и мой код выглядит следующим образом;

РЕДАКТИРОВАТЬ: я добавил SQLite в настройке памяти, которую я использую. Не уверен, что мне это нужно для магазинов IS4 InMemory.

var builder = services
    .AddIdentityServer(options =>
    {
        options.IssuerUri = "https://my.services.is4host";
        options.Events.RaiseErrorEvents = true;
        options.Events.RaiseInformationEvents = true;
        options.Events.RaiseFailureEvents = true;
        options.Events.RaiseSuccessEvents = true;
    });

var migrationAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;  

var inMemorySqlite = new SqliteConnection("Data Source=:memory:");
inMemorySqlite.Open();

services
    .AddDbContext<SecurityDbContext>(
        options => options.UseSqlite(inMemorySqlite,
            sql => sql.MigrationsAssembly(migrationAssembly)));

// Migrate the database
var context = services.BuildServiceProvider().GetService<SecurityDbContext>();
context.Database.Migrate();

builder
    .AddInMemoryClients(IS4Config.GetClients())
    .AddInMemoryIdentityResources(IS4Config.GetIdentityResources())
    .AddInMemoryApiResources(IS4Config.GetAPIResources())
    .AddTestUsers(new List<TestUser>
    {
            new TestUser {
                SubjectId = Guid.NewGuid().ToString(),
                Claims = new List<Claim> {
                    new Claim(JwtClaimTypes.Subject, MyDemoUser.ElevatedUser.UserName),
                    new Claim(JwtClaimTypes.Email, MyDemoUser.ElevatedUser.Email),
                    new Claim(JwtClaimTypes.Role, MyDemoUser.ElevatedUser.Roles[0]),
                    new Claim(JwtClaimTypes.Role, MyDemoUser.ElevatedUser.Roles[1])
                },
                IsActive = true,
                Password = MyDemoUser.ElevatedUser.Password,
                Username = MyDemoUser.ElevatedUser.UserName
            },
            new TestUser {
                SubjectId = Guid.NewGuid().ToString(),
                Claims = new List<Claim> {
                    new Claim(JwtClaimTypes.Subject, MyDemoUser.WorkstationUser.UserName),
                    new Claim(JwtClaimTypes.Email, MyDemoUser.WorkstationUser.Email),
                    new Claim(JwtClaimTypes.Role, MyDemoUser.WorkstationUser.Roles[0])
                },
                IsActive = true,
                Password = MyDemoUser.WorkstationUser.Password,
                Username = MyDemoUser.WorkstationUser.UserName
            }
    });

и мой тест выглядит так:

var is4Host = new WebApplicationTestFactory<Services.IS4Host.Startup>();
var client = is4Host.CreateClient();

var disco = await client.GetDiscoveryDocumentAsync("https://My.services.is4host");
if (disco.IsError)
{
    Console.WriteLine(disco.Error);
    return false;
}

// request token
var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest
{
    Address = disco.TokenEndpoint,
    ClientId = MyClient.ClientId,
    ClientSecret = MyClient.ClientSecret,
    Scope = MyApiResource.Gateway.Name,
    UserName = user.UserName,
    Password = user.Password
});

if (tokenResponse.IsError)
{
    Console.WriteLine(tokenResponse.Error);
    return false;
}

Console.WriteLine(tokenResponse.Json);
Console.WriteLine("\n\n");

return true;

Я добавляю записи в хранилища памяти, но получаю ответ ниже от IS4

{
  "error": "invalid_grant",
  "error_description": "invalid_username_or_password"
}
...