« AWS SDK for .NET » : différence entre les versions
Apparence
Ligne 246 : | Ligne 246 : | ||
= Get user info from Cognito in an ASP.NET web API = | = Get user info from Cognito in an ASP.NET web API = | ||
Usually a web API is called with an Access Token which doesn't contain information regarding the user but instead authorizations for actions. | Usually a web API is called with an Access Token which doesn't contain information regarding the user but instead authorizations for actions. | ||
{{warn | The AccessToken needs to have the scope {{boxx|aws.cognito.signin.user.admin}} to be allowed to call {{boxx|cognitoService.GetUserAsync}}}} | {{warn | The AccessToken needs to have the scope {{boxx|aws.cognito.signin.user.admin}} or no scope to be allowed to call {{boxx|cognitoService.GetUserAsync}}}} | ||
<filebox fn='Program.cs' collapsed> | <filebox fn='Program.cs' collapsed> |
Version du 8 mars 2024 à 13:51
Links
Config
This file contains the profiles.
∼/.aws/config |
[default]
region = eu-central-1
[profile Profile1]
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_region = us-west-1
sso_account_id = 111122223333
sso_role_name = SampleRole
region = eu-central-1
output = yaml-stream
services = local-dynamodb
[services local-dynamodb]
dynamodb =
endpoint_url = http://localhost:8000
|
aws sso login --profile Profile1
|
Define the AWS_PROFILE in an env var while starting the project.
Properties\launchSettings.json |
Credentials
This file contains credentials linked to profiles.
∼/.aws/credentials |
[default]
aws_access_key_id = ...
aws_secret_access_key = ...
aws_session_token = ...
[Profile1]
key = value
|
Example .NET applications
|
Install the following nuget packages: AWSSDK.Core AWSSDK.SecurityToken AWSSDK.SSO AWSSDK.SSOOIDC
For IAM users: AWSSDK.IdentityManagement
For S3 buckets: AWSSDK.S3
Load .NET configuration from Secrets Manager
AmazonSecretsManagerConfigurationProvider.cs |
AmazonSecretsManagerConfigurationSource.cs |
ConfigurationBuilderExtensions.cs |
Program.cs |
builder.Configuration.AddAmazonSecretsManager("Secret name");
var secretValue = builder.Configuration["Secret key"];
|
Authentication with Cognito JWT Token
Program.cs |
builder.Services.AddCognitoIdentity();
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.Authority = builder.Configuration["AWSCognito:Authority"];
options.Audience = builder.Configuration["AWSCognito:UserPoolClientId"];
options.TokenValidationParameters.AudienceValidator = (audiences, securityToken, validationParameters) =>
{
// This is necessary because Cognito access tokens doesn't have "aud" claim.
// Instead the audience is set in "client_id"
var jwt = (JsonWebToken)securityToken;
var audience = jwt.Claims.FirstOrDefault(x => x.Type == "client_id" || x.Type == "aud");
if (audience is null)
return false;
return validationParameters.ValidAudience == audience.Value;
};
});
|
Install the following nuget packages: Amazon.AspNetCore.Identity.Cognito
aws-aspnet-cognito-identity-provider
![]() |
Cognito is not a fully OIDC-compliant provider |
Validate Issuer Signing Key
Useful id an ID token is used instead of an Access token.
Program.cs |
var signingKeys = await GetSigningKeysAsync();
builder.Services.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true, // needed if an ID token is used
IssuerSigningKeys = signingKeys
};
});
async Task<IList<JsonWebKey>> GetSigningKeysAsync()
{
var httpClient = new HttpClient();
var response = await httpClient.GetAsync($"{builder.Configuration["AWSCognito:Authority"]}/.well-known/jwks.json");
var keySet = await response.Content.ReadAsAsync<JsonWebKeySet>();
return keySet.Keys;
}
|
Get user info from Cognito in an ASP.NET web API
Usually a web API is called with an Access Token which doesn't contain information regarding the user but instead authorizations for actions.
![]() |
The AccessToken needs to have the scope aws.cognito.signin.user.admin or no scope to be allowed to call cognitoService.GetUserAsync |
Program.cs |
ApplicationUserProvider.cs |
private readonly IHttpContextAccessor httpContextAccessor;
private readonly IAmazonCognitoIdentityProvider cognitoService;
public ApplicationUserProvider(IHttpContextAccessor httpContextAccessor, IAmazonCognitoIdentityProvider cognitoService)
{
this.httpContextAccessor = httpContextAccessor;
this.cognitoService = cognitoService;
}
public async Task GetUserInfo()
{
var accessToken = await httpContextAccessor.HttpContext!.GetTokenAsync(OpenIdConnectParameterNames.AccessToken); // "access_token"
if (accessToken is not null)
{
var userResponse = await cognitoService.GetUserAsync(new GetUserRequest
{
AccessToken = accessToken
});
}
}
|