C# 访问/保护Restful服务oAuth2
我正在尝试编写一个Restful服务,它有多个端点,比如 假设每个端点调用都由一个角色保护C# 访问/保护Restful服务oAuth2,c#,asp.net-web-api,oauth-2.0,identityserver4,C#,Asp.net Web Api,Oauth 2.0,Identityserver4,我正在尝试编写一个Restful服务,它有多个端点,比如 假设每个端点调用都由一个角色保护 GetEmployees(角色/声明=Employee.Readonly或Employee.Edit或Employee.Admin) AddEmployee(角色/索赔=Employee.Edit或Employee.Admin) UpdateEmployee(角色/索赔=Employee.Edit或Employee.Admin) DeleteEmployee(角色/索赔=Employee.Admin) 对
我的困惑在于客户端凭据流,这里如何将作用域映射到角色?让我们假设客户端凭据方法存在以下情况:
var client = new TokenClient(
BaseAddress + "/connect/token",
"clientId",
"clientSecret");
var result = client.RequestClientCredentialsAsync(scope: "my.api").Result;
var accessToken = result.AccessToken;
var client = new HttpClient();
client.SetBearerToken(accessToken);
var result = client.GetStringAsync("https://protectedapiaddress/api/data/getdata").Result;
其中BaseAddress是您的ID地址
当然,您必须使用适当的流(客户机凭据)在IDS客户机列表中注册您的客户机,范围只是可选的,但我想您需要一个
然后在API方面,您可以使用新的
API方法:
[HttpGet]
[Authorize(Policy = "AdminUser")]
[Route("getdata")]
public Data GetData()
{
// some code here
}
以及授权要求:
public class AdminUserRequirement : AuthorizationHandler<AdminUserRequirement>, IAuthorizationRequirement
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AdminUserRequirement requirement)
{
if (!context.User.HasClaim(<'Your rule'>))
{
context.Fail();
}
else
{
context.Succeed(requirement);
}
return Task.FromResult(0);
}
}
还有更多。然后你可以应用规则
编辑:忘记提及-您必须在Startup.cs中注册策略
public void ConfigureServices(IServiceCollection services)
{
services
.AddMvcCore()
.AddAuthorization(options =>
{
options.AddPolicy("AdminUser",
policy => policy.Requirements.Add(new AdminUserRequirement()));
});
// More code here
}
使用策略或角色只是语法的改变。范围“my.api”如何转化为策略?如果我们按照您的方式合并我的示例,我将有3种策略,即只读、用户、管理员用户。在requirement类中,我将寻找确切的声明,但范围如何转化为策略?我并不是说范围转化为策略。我只是说,您将在声明中拥有作用域和clientid,因为对于客户端凭据流,您所拥有的只是这些,您可以在策略中使用它们来允许/拒绝访问。在策略上更像是自定义授权属性。是的,如果你这样做,你将需要为每个不同的角色制定不同的政策。很多人不喜欢它,这是一种开销,但微软。。。
public void ConfigureServices(IServiceCollection services)
{
services
.AddMvcCore()
.AddAuthorization(options =>
{
options.AddPolicy("AdminUser",
policy => policy.Requirements.Add(new AdminUserRequirement()));
});
// More code here
}