.net 在IdentityServer4中保护客户端

.net 在IdentityServer4中保护客户端,.net,oauth-2.0,identityserver4,openid-connect,.net,Oauth 2.0,Identityserver4,Openid Connect,我有以下情况: 我对如何在IdentityServer4中设置API2感到困惑,因为在我看来它既是客户机(因为它消耗了API1提供的资源)又是ApiResource(因为我想保护它,这样只有登录的用户才能访问它) 我已经考虑将API2设置为客户端,并使用cookie身份验证对其进行保护。我认为这与他们在MVC客户机中的工作类似。但是,我不喜欢它,因为所有关于用户的信息都存储在服务器端,所以我的JavaScript应用程序无法知道用户的姓名、电子邮件等 处理这种情况的最佳方法是什么 基本上,您需

我有以下情况:

我对如何在IdentityServer4中设置API2感到困惑,因为在我看来它既是
客户机(因为它消耗了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发送调用