【发布时间】:2019-10-31 11:18:00
【问题描述】:
我有自己的授权服务器,构建在 identityserver4 之上,我想保护主机上的所有 api。系统只是对 google 开发人员或 facebook 开发人员的简单模仿,应用程序所有者在其中注册并获取客户端 ID 和客户端密码,以便在 api 上授予访问权限。
所以我在 identityserver4 样本上遵循 client_credentials 流程。一切正常。我为应用程序所有者构建了一个公共 UI,以创建应用程序并选择从他们的应用程序中访问哪些 api。我使用IConfigurationDbContext 进行身份服务器内部表上的CRUD procecces。
问题是我无法根据应用所有者的选择找到保护 api 的方法,当开发人员创建应用并选择一些逻辑端点进行访问时,它们仍然可以访问所有端点。我所做的如下;
授权服务器启动
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryCaching()
.AddOperationalStore(storeOpitons =>
{
storeOpitons.ConfigureDbContext = builder =>
builder.UseSqlServer(Configuration.GetConnectionString("Default"),
sql => sql.MigrationsAssembly(migrationsAssembly));
})
.AddConfigurationStore(storeOptions =>
{
storeOptions.ConfigureDbContext = builder =>
builder.UseSqlServer(Configuration.GetConnectionString("Default"),
sql => sql.MigrationsAssembly(migrationsAssembly));
});
保存客户端方法
public IActionResult SaveApp(ClientViewModel model, List<SelectedApi> selectedApis)
{
//ommited for brevity
Client client = new Client
{
Description = model.Description,
ClientName = model.Name,
RedirectUris = new[] { model.CallBackUri }
};
client.AllowedScopes = selectedApis.Where(a => a.apiValue == "true").Select(a => a.apiName).ToList();
//e.g : client.AllowedScopes = {"employee_api"};
_isRepository.SaveClient(client, userApp);
}
Api 项目启动
services.AddAuthentication("Bearer").AddJwtBearer(opt => {
opt.Authority = "http://localhost:5000";
opt.Audience = "employee_api";
opt.RequireHttpsMetadata = false;
});
Api 示例控制器
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class EmployeeController : BaseController
{
private readonly IEmployeeRepository _employeeRepoistory;
public EmployeeController(IServiceProvider provider, IEmployeeRepository employeeRepository) : base(provider)
{
_employeeRepoistory = employeeRepository;
}
[HttpGet]
public IActionResult GetEmployees([FromQuery] EmployeeResourceParameter parameter)
{
return Ok(_mapper.Map<IEnumerable<EmployeeModel>>(_employeeRepoistory.GetAll(parameter)));
}
[HttpGet("{id:int}")]
public IActionResult GetEmployeeById(int id)
{
var emp = _employeeRepoistory.GetById(id);
return Ok(_mapper.Map<EmployeeModel>(emp));
}
}
我想要的是,如果开发人员选择employee_api,他们应该只访问EmployeeController 的端点。但是现在,无论他们的选择是什么,他们都可以访问所有的 api。 在 api 端或身份验证服务器端对此采取哪些步骤?
【问题讨论】:
标签: c# identityserver4 asp.net-core-3.0