Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
Jwt 在使用OpenId(Cognito)进行身份验证后,如何在Blazor WebAssembly中获取id_令牌?_Jwt_Openid Connect_Access Token_Blazor_Blazor Webassembly - Fatal编程技术网

Jwt 在使用OpenId(Cognito)进行身份验证后,如何在Blazor WebAssembly中获取id_令牌?

Jwt 在使用OpenId(Cognito)进行身份验证后,如何在Blazor WebAssembly中获取id_令牌?,jwt,openid-connect,access-token,blazor,blazor-webassembly,Jwt,Openid Connect,Access Token,Blazor,Blazor Webassembly,我有一个.NETCore3.1WebAPI后端 我有一个Blazor WebAssembly前端 我尝试在前端(works)登录到AWS Cognito(设置为OpenId提供者),然后在每个请求上向我的后端API传递一个承载令牌(JWT),以便后端API可以使用临时凭证(CognitoAWSCredentials)访问AWS资源 我能够在每次请求时将一个承载令牌从Blazor前端传递到后端,但是我能在Blazor中找到的唯一可以访问的令牌是访问令牌。我需要ID令牌,以便允许后端代表我的用户生成

我有一个.NETCore3.1WebAPI后端

我有一个Blazor WebAssembly前端

我尝试在前端(works)登录到AWS Cognito(设置为OpenId提供者),然后在每个请求上向我的后端API传递一个承载令牌(JWT),以便后端API可以使用临时凭证(CognitoAWSCredentials)访问AWS资源

我能够在每次请求时将一个承载令牌从Blazor前端传递到后端,但是我能在Blazor中找到的唯一可以访问的令牌是访问令牌。我需要ID令牌,以便允许后端代表我的用户生成凭据

在我的Blazor代码中,我已成功注册了一个自定义AuthorizationMessageHandler,它在访问我的API时获取每个HttpClient的SendAsync上的调用:

protectedoverride async Task sendaync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
HttpRequestHeaders headers=请求?.headers;
AuthenticationHeaderValue authHeader=头?。授权;
if(headers为object&&authHeader为null)
{
AccessTokenResult=Wait TokenProvider.RequestAccessToken();
if(result.TryGetToken(out AccessToken))
{
authHeader=新的AuthenticationHeaderValue(“承载者”,token.Value);
request.Headers.Authorization=authHeader;
}
logger.LogObjectDebug(请求);
}
返回wait base.sendaync(请求、取消令牌);
}
这将添加访问令牌,后端将拾取该令牌并对其进行验证。 但是,要为AWS服务创建用于特权的CognitoAWSCredentials,我需要ID令牌

我无法在Blazor中找到任何访问ID令牌的方法。

如果我直接访问我的后端WebApi,它会正确地将我转发到Cognito登录,然后返回。当它这样做时,HttpContext包含“id_令牌”。然后可以使用它来创建我需要的CognitoAWSCredentials

缺少的链接是如何访问Blazor中的ID令牌,因此我可以将其作为授权HTTP头的承载令牌,而不是访问令牌

添加更多的代码上下文

程序.cs:Main
string CognitoMetadataAddress=$“{settings.Cognito.Authority?.TrimEnd('/')}/.well-known/openid配置”;
builder.Services.AddOidcAuthentication(选项=>
{
options.ProviderOptions.Authority=settings.Cognito.Authority;
options.ProviderOptions.MetadataUrl=CognitoMetadataAddress;
options.ProviderOptions.ClientId=settings.Cognito.ClientId;
options.ProviderOptions.RedirectUri=$“{builder.HostenEnvironment.BaseAddress.TrimEnd('/')}/authentication/login callback”;
options.ProviderOptions.ResponseType=OpenIdConnectResponseType.Code;
})
.AddAccountClaimsPrincipalFactory()的名称
;
builder.Services.AddOptions();
builder.Services.AddAuthorizationCore();
字符串APIBaseUrl=builder.Configuration.GetSection(“部署”)[“APIBaseUrl”];
builder.Services.AddSingleton();
builder.Services.AddHttpClient(settings.HttpClientName,client=>
{
client.BaseAddress=新Uri(APIBaseUrl);
})
.AddHttpMessageHandler()
;
正在发送http请求(Blazor示例代码的微小更改)。。。
HttpRequestMessage requestMessage=new-HttpRequestMessage()
{
方法=新的HttpMethod(方法),
RequestUri=新的Uri(Uri),
Content=string.IsNullOrEmpty(requestBody)?null:新的StringContent(requestBody)
};
foreach(RequestHeader中的RequestHeader标头)
{
//StringContent自动添加自己的内容类型标题,默认值为“text/plain”
//如果开发人员试图显式指定内容类型,我们需要替换默认值,
//而不是添加第二个内容类型标题。
if(header.Name.Equals(“内容类型”,StringComparison.OrdinalIgnoreCase)和&requestMessage.Content!=null)
{
requestMessage.Content.Headers.ContentType=新系统.Net.Http.Headers.MediaTypeHeaderValue(header.Value);
继续;
}
如果(!requestMessage.Headers.tryaddwithout验证(header.Name,header.Value))
{
requestMessage.Content?.Headers.tryadd未经验证(header.Name,header.Value);
}
}
HttpClient Http=HttpClientFactory.CreateClient(Settings.HttpClientName);
HttpResponseMessage response=等待Http.SendAsync(requestMessage);
当OpenIdConnect中间件尝试使用Cognito进行授权时,它调用:

https://<DOMAIN>/oauth2/authorize?client_id=<CLIENT-ID>&redirect_uri=https%3A%2F%2Flocalhost%3A44356%2Fauthentication%2Flogin-callback&response_type=code&scope=openid%20profile&state=<HIDDEN>&code_challenge=<HIDDEN>&code_challenge_method=S256&response_mode=query
但是,添加到Http请求的AccessToken是一个访问令牌。 以下是添加到HTTP请求中的解码JWT令牌的
令牌\u use
声明:

  {
    "Type": "token_use",
    "Value": "access",
    "ValueType": "http://www.w3.org/2001/XMLSchema#string",
    "Subject": null,
    "Properties": {},
    "OriginalIssuer": "https://cognito-idp.ca-central-1.amazonaws.com/<USER-POOL-ID>",
    "Issuer": "https://cognito-idp.ca-central-1.amazonaws.com/<USER-POOL-ID>"
  }
{
“类型”:“使用令牌”,
“值”:“访问”,
“ValueType”:http://www.w3.org/2001/XMLSchema#string",
“主题”:空,
“属性”:{},
“原创者”:https://cognito-idp.ca-central-1.amazonaws.com/",
“发行人”:https://cognito-idp.ca-central-1.amazonaws.com/"
}
由于Blazor API是
IAccessTokenProvider.RequestAccessToken()
,所以哪一种是有意义的。。。似乎没有API来请求ID令牌。

多亏了上的答案,我才能够获得ID\u令牌。示例代码如下:

@page/“
@使用System.Text.Json
@注入IJSRuntime JSRuntime
第一。
@代码{
JsonSerializerOptions indented=new JsonSerializerOptions(){writeIndended=true};
CachedAuthSettings;
认知用户;
受保护的重写异步任务OnInitializedAsync()
{
string key=“Microsoft.AspNetCore.Components.WebAssembly.Authentication.CachedAuthSettings”;
string authSettingsRAW=等待JSRuntim
  {
    "Type": "token_use",
    "Value": "access",
    "ValueType": "http://www.w3.org/2001/XMLSchema#string",
    "Subject": null,
    "Properties": {},
    "OriginalIssuer": "https://cognito-idp.ca-central-1.amazonaws.com/<USER-POOL-ID>",
    "Issuer": "https://cognito-idp.ca-central-1.amazonaws.com/<USER-POOL-ID>"
  }