gpt4 book ai didi

amazon-cognito - 如何将 OpenID 身份验证从 Blazor WebAssembly 传递到 .NET Core WebApi 后端,两者都使用 Cognito 作为 OpenID 提供程序?

转载 作者:行者123 更新时间:2023-12-05 02:51:53 25 4
gpt4 key购买 nike

技术目标:

  • 客户端:Blazor WebAssembly
  • 后端:Lambda (AWS) 上的 .NET Core 3.1 WebApi 通过 ApiGateway (/{proxy+})
  • 身份验证:AWS Cognito

后端:

  • 我有一个 .NET Core Lambda 函数,该函数通过 ApiGateway/{proxy+} => Lambda 通过 AWS ApiGateway (RestApi) 访问。这部署和工作正常。我已将 WebApi 配置为使用 AWS Cognito 作为其身份验证方法(代码来自 Startup..cs:ConfigureServices,如下所示)。
  • 我可以在我的路线上成功使用 [Authorize] 属性,当我直接在浏览器中使用 [Authorize] 访问路线时,我会被发送到 Cognito 签名页面,我可以登录并被送回我的Api 和调用执行。效果很好。

Startup.cs:ConfigureServices

RegionEndpoint region = Configuration.GetAWSOptions().Region;
string CognitoMetadataAddress = $"https://cognito-idp.{region.SystemName}.amazonaws.com/{AppConfig.CognitoPoolId}/.well-known/openid-configuration";

//
// Ref: https://criticalhittech.com/2019/02/19/asp-net-core-with-aws-lambda-and-cognito/
//
services.Configure<OpenIdConnectOptions>(options =>
{
options.AuthenticationMethod = OpenIdConnectRedirectBehavior.RedirectGet;
options.ClientId = AppConfig.CognitoClientId;
options.MetadataAddress = CognitoMetadataAddress;
options.ResponseType = OpenIdConnectResponseType.Code;
options.SaveTokens = true;
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true
};
});
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.ClientId = AppConfig.CognitoClientId;
options.MetadataAddress = CognitoMetadataAddress;
options.ResponseType = OpenIdConnectResponseType.Code;
options.SaveTokens = true;
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true
};
options.Events = new OpenIdConnectEvents()
{
OnRedirectToIdentityProvider = OnRedirectToIdentityProvider,
OnRedirectToIdentityProviderForSignOut = OnRedirectToIdentityProviderForSignOut,
OnAuthenticationFailed = OnAuthenticationFailed,
OnUserInformationReceived = OnUserInformationReceived
};
});

客户端:

  • 我有一个使用 WebAssembly 的基本 Blazor 项目(因此我最终可以将编译后的静态输出放到 AWS S3 上并将其托管在那里)。
  • 我已将项目配置为使用 Cognito 作为它的身份验证源(请参阅下面的 Program.cs:Main 代码)并且它工作“正常”(它当然有 dumb Cognito X-Frame-Options issue,但它工作)。

Program.cs:Main

string CognitoPoolId = "ca-central-1_<REMOVED>";
string region = CognitoPoolId.Substring(0, CognitoPoolId.IndexOf('_', StringComparison.InvariantCultureIgnoreCase));
string CognitoAuthority = $"https://cognito-idp.{region}.amazonaws.com/{CognitoPoolId}";
string CognitoMetadataAddress = $"https://cognito-idp.{region}.amazonaws.com/{CognitoPoolId}/.well-known/openid-configuration";

builder.Services.AddOidcAuthentication(options =>
{
options.ProviderOptions.Authority = CognitoAuthority;
options.ProviderOptions.MetadataUrl = CognitoMetadataAddress;
options.ProviderOptions.ClientId = "<REMOVED>";
options.ProviderOptions.RedirectUri = $"{builder.HostEnvironment.BaseAddress.TrimEnd('/')}/authentication/login-callback";
options.ProviderOptions.ResponseType = "code";

});

builder.Services.AddOptions();
builder.Services.AddAuthorizationCore();

问题在我的 Blazor 应用程序中,我想调用我的后端 API(需要身份验证)并使用 Blazor 应用程序已有的授权,因为客户端和后端都使用相同的 Cognito 用户池。即

  1. 加载 Blazor 应用
  2. 完成登录
  3. 对我的后端进行 Http 调用 <-- 使用 #2 中的登录 session
            HttpResponseMessage response = await Http.SendAsync(requestMessage);

如何将 HttpClient 实例配置为发送 Blazor 应用通过 Cognito 身份验证获得的授权,以便它可以调用 protected API?

最佳答案

呃,当然很简单......

@inject HttpClient Http
@inject IAccessTokenProvider TokenProvider
...
HttpRequestMessage requestMessage = new HttpRequestMessage()
{
...
};
AccessTokenResult result = await TokenProvider.RequestAccessToken();
if (result.TryGetToken(out AccessToken token))
{
requestMessage.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", token.Value);
}
HttpResponseMessage response = await Http.SendAsync(requestMessage);

编辑:阅读本文的任何人,请参阅 How do I get the id_token in Blazor WebAssembly after authenticating with OpenId (Cognito)?如果您打算在 Cognito 中使用身份池来限定用户对特定 IAM 角色的访问范围,那么您将需要 id_token 而不是 access_token。

关于amazon-cognito - 如何将 OpenID 身份验证从 Blazor WebAssembly 传递到 .NET Core WebApi 后端,两者都使用 Cognito 作为 OpenID 提供程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62906320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com