.net 在IdentityServer4中保护客户端
我有以下情况: 我对如何在IdentityServer4中设置API2感到困惑,因为在我看来它既是.net 在IdentityServer4中保护客户端,.net,oauth-2.0,identityserver4,openid-connect,.net,Oauth 2.0,Identityserver4,Openid Connect,我有以下情况: 我对如何在IdentityServer4中设置API2感到困惑,因为在我看来它既是客户机(因为它消耗了API1提供的资源)又是ApiResource(因为我想保护它,这样只有登录的用户才能访问它) 我已经考虑将API2设置为客户端,并使用cookie身份验证对其进行保护。我认为这与他们在MVC客户机中的工作类似。但是,我不喜欢它,因为所有关于用户的信息都存储在服务器端,所以我的JavaScript应用程序无法知道用户的姓名、电子邮件等 处理这种情况的最佳方法是什么 基本上,您需
客户机(因为它消耗了API1提供的资源)又是ApiResource
(因为我想保护它,这样只有登录的用户才能访问它)
我已经考虑将API2设置为客户端
,并使用cookie身份验证对其进行保护。我认为这与他们在MVC客户机中的工作类似。但是,我不喜欢它,因为所有关于用户的信息都存储在服务器端,所以我的JavaScript应用程序无法知道用户的姓名、电子邮件等
处理这种情况的最佳方法是什么 基本上,您需要使用Identity Server保护两个API。比如:
var client = new HttpClient();
client.SetBearerToken(accessToken);
client.GetStringAsync("https://localhost/api1/test");
API 1 Startup.cs:
services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
options.Authority = "https://localhost:5000";
options.SupportedTokens = SupportedTokens.Both;
options.RequireHttpsMetadata = false;
options.ApiName = "api1";
});
API 2也是这样,但是选项.ApiName
应该不同。然后,在Identity Server端构建javascript客户端时,应允许其访问以下2个api(允许的作用域):
此代码来自
然后在API 2中,当您想要调用API 1的控制器时,您需要如下内容:
var client = new HttpClient();
client.SetBearerToken(accessToken);
client.GetStringAsync("https://localhost/api1/test");
您在哪里获得访问\u令牌
:
[Authorize]
public async Task<IActionResult> ControllerMethodInApi2()
{
var accessToken = await context.HttpContext.GetTokenAsync("access_token");
return View();
}
[授权]
公共异步任务控制器methodinapi2()
{
var accessToken=await context.HttpContext.GetTokenAsync(“访问令牌”);
返回视图();
}
这应该适合您。基本上,您需要使用Identity Server保护两个API。比如:
var client = new HttpClient();
client.SetBearerToken(accessToken);
client.GetStringAsync("https://localhost/api1/test");
API 1 Startup.cs:
services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
options.Authority = "https://localhost:5000";
options.SupportedTokens = SupportedTokens.Both;
options.RequireHttpsMetadata = false;
options.ApiName = "api1";
});
API 2也是这样,但是选项.ApiName
应该不同。然后,在Identity Server端构建javascript客户端时,应允许其访问以下2个api(允许的作用域):
此代码来自
然后在API 2中,当您想要调用API 1的控制器时,您需要如下内容:
var client = new HttpClient();
client.SetBearerToken(accessToken);
client.GetStringAsync("https://localhost/api1/test");
您在哪里获得访问\u令牌
:
[Authorize]
public async Task<IActionResult> ControllerMethodInApi2()
{
var accessToken = await context.HttpContext.GetTokenAsync("access_token");
return View();
}
[授权]
公共异步任务控制器methodinapi2()
{
var accessToken=await context.HttpContext.GetTokenAsync(“访问令牌”);
返回视图();
}
这应该对您有用。api 1和api 2之间的调用是否需要包含用户数据(声明等)?@m3n7alsnak3是的。因此,为了澄清问题,您需要两个api都由相同的ID保护,您需要一个用户,他向api 2发送请求(我猜是其他api),但只向api 2发送请求,能够针对API 1执行?正确。基本上,我希望用户能够使用其凭据登录到API 2,然后我希望API 2代表该用户向API 1发送请求。但您不希望用户能够直接向API 1发送调用API 1和API 2之间的调用是否需要包含用户数据(声明等)?@m3n7alsnak3是,是的。所以要说清楚,您需要两个API都由相同的ID保护,您需要一个用户,他向API 2(我猜是其他API)发送请求,但只发送到API 2的请求,以便能够针对API 1执行?正确。基本上,我希望用户能够使用其凭据登录到API 2,然后我希望API 2代表该用户向API 1发送请求。但您不希望用户能够直接向API 1发送调用