Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 功能测试跳过授权WebApplicationFactory OIDC_C#_Asp.net Core_Asp.net Web Api_Openid Connect_Functional Testing - Fatal编程技术网

C# 功能测试跳过授权WebApplicationFactory OIDC

C# 功能测试跳过授权WebApplicationFactory OIDC,c#,asp.net-core,asp.net-web-api,openid-connect,functional-testing,C#,Asp.net Core,Asp.net Web Api,Openid Connect,Functional Testing,目标:使用模拟访问令牌创建功能测试,但跳过授权(不调用端点)。测试我的web API的控制器方法。API受通过访问令牌(承载)的身份验证/授权的保护。与外部身份服务器4通信 当前:已创建我的自定义WebApplicationFactory,数据库已设置种子,访问令牌已创建 问题:当identity server 4未运行时,测试失败。我不知道如何精确地模拟身份服务器。自行创建的访问令牌正在工作。如果identity server正在运行,则测试将通过授权 MockJwtToken.cs 公共静态

目标:使用模拟访问令牌创建功能测试,但跳过授权(不调用端点)。测试我的web API的控制器方法。API受通过访问令牌(承载)的身份验证/授权的保护。与外部身份服务器4通信

当前:已创建我的自定义WebApplicationFactory,数据库已设置种子,访问令牌已创建

问题:当identity server 4未运行时,测试失败。我不知道如何精确地模拟身份服务器。自行创建的访问令牌正在工作。如果identity server正在运行,则测试将通过授权

MockJwtToken.cs

公共静态类MockJwtToken
{
公共静态字符串颁发者{get;}=”https://localhost:5001";
公共静态字符串访问群体{get;}=”https://localhost:5001/resources";
公共静态安全密钥安全密钥{get;}
公共静态签名凭据签名凭据{get;}
私有静态只读JwtSecurityTokenHandler STokenHandler=new JwtSecurityTokenHandler();
私有静态只读RandomNumberGenerator SRng=RandomNumberGenerator.Create();
私有静态只读字节[]SKey=新字节[32];
静态MockJwtToken()
{
SRng.GetBytes(SKey);
SecurityKey=new-SymmetricSecurityKey(SKey){KeyId=Guid.NewGuid().ToString()};
SigningCredentials=新的SigningCredentials(SecurityKey,SecurityAlgorithms.HmacSha256);
}
公共静态字符串GenerateJwtToken(IEnumerable声明)
{
返回STokenHandler.WriteToken(新的JwtSecurityToken(颁发者、受众、声明、null、DateTime.UtcNow.AddMinutes(20),SigningCredentials));
}
公共静态字符串GenerateJwtTokenAsUser()
{
返回GenerateJwtToken(UserClaims);
}
公共静态列表UserClaims{get;set;}=新列表
{
新声明(JwtClaimTypes.PreferredUserName,“test”),
新索赔(JwtClaimTypes.Email,“test@test.com"),
新索赔(JwtClaimTypes.Subject,“10000000-0000-0000-0000-000000000000”),
新索赔(JwtClaimTypes.Scope,“openid”),
新索赔(JwtClaimTypes.Scope,“api.com:read”),
新索赔(JwtClaimTypes.Scope,“api.com:write”),
};
}
这是我定制的WebApplicationFactory

公共类CustomWebApplicationFactory:WebApplicationFactory
{
私有只读字符串_connectionString=“DataSource=:memory:”;
专用只读SqliteConnection\u连接;
公共CustomWebApplicationFactory()
{
_连接=新的SqliteConnection(_connectionString);
_connection.Open();
}
受保护的覆盖IHost CreateHost(IHostBuilder)
{
var host=builder.Build();
var serviceProvider=host.Services;
使用(var scope=serviceProvider.CreateScope())
{
var scopedServices=scope.ServiceProvider;
var context=scopedServices.GetRequiredService();
var logger=scopedServices.GetRequiredService();
var dbInit=新的DbInitializer(上下文);
尝试
{
dbInit.MigrateDatabase();
}
捕获(例外e)
{
logger.LogError(e,“为“+$”数据库设定测试消息种子时出错。错误:{e.Message}”);
}
尝试
{
dbInit.SeedAllEnums();
}
捕获(例外e)
{
logger.LogError(e,“为“+$”数据库设定测试消息种子时出错。错误:{e.Message}”);
}
}
host.Start();
返回主机;
}
受保护的覆盖无效配置WebHost(IWebHostBuilder)
{
建设者
.UseSolutionRelativeContentRoot(“src/Project.Api.Web”)
.ConfigureTestServices(ConfigureServices)
.使用环境(“测试”);
}
受保护的虚拟void配置服务(IServiceCollection服务)
{
var descriptor=services.SingleOrDefault(d=>d.ServiceType==typeof(DbContextOptions));
if(描述符!=null)
{
删除(描述符);
}
配置(JwtBearerDefaults.AuthenticationScheme,选项=>
{
options.TokenValidationParameters=CreateTokenValidationParameters();
options.audition=MockJwtToken.audition;
options.Authority=MockJwtToken.Issuer;
});
//使用内存中的数据库添加ApplicationDbContext以进行测试。
服务
.AddentityFrameworkQlite()的
.AddDbContext(选项=>
{
选项。使用SQLite(_连接);
options.UseInternalServiceProvider(services.BuildServiceProvider());
});
}
受保护的覆盖无效处置(布尔处置)
{
基地。处置(处置);
_connection.Close();
}
私有TokenValidationParameters CreateTokenValidationParameters()
{
TokenValidationParameters TokenValidationParameters=新的TokenValidationParameters
{
validateisuer=false,
ValidateAudience=false,
ValidateSuersigningKey=true,
IssuerSigningKey=MockJwtToken.SecurityKey,
SignatureValidator=委托(字符串令牌、令牌验证参数)
{
JwtSecurityToken jwt=新JwtSecurityToken