Я пытаюсь использовать AWS Cognito для моей аутентификации в MVC-приложении .Net Core.
Вход в систему работает нормально, но ни одна из моих форм в представлениях не работает, все они выдают ошибку о моих утвержденияхне содержит «Name» -Claim.
Я пытался добавить заявку-имя вручную, но все равно выдает ошибки.
Есть идеи, как настроить это в ядре .net?
Сообщение об ошибке:
InvalidOperationException: Предоставленный идентификатор типа 'System.Security.Claims.ClaimsIdentity' помечен IsAuthenticated = true, но не имеет значения для имени.По умолчанию система защиты от подделки требует, чтобы все идентифицированные личности имели уникальное имя.Если невозможно предоставить уникальное имя для этого идентификатора, рассмотрите возможность расширения IAntiforgeryAdditionalDataProvider путем переопределения DefaultAntiforgeryAdditionalDataProvider или пользовательского типа, который может предоставить некоторую форму уникального идентификатора для текущего пользователя.
Startup-config:
services.AddAuthentication(options =>
{
//Sets Default Scheme.
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
//Must match the string for AddOAuth to set OAuth as default Challenge Scheme.
options.DefaultChallengeScheme = "Cognito";
})
.AddCookie()
.AddOAuth("Cognito", options =>
{
options.ClientId = Configuration["Authentication:Cognito:ClientId"];
options.ClientSecret = Configuration["Authentication:Cognito:Secret"];
options.CallbackPath = new PathString("/sign-in");
options.AuthorizationEndpoint = "https://myauth.auth.eu-west-1.amazoncognito.com/oauth2/authorize";
options.TokenEndpoint = "https://myauth.auth.eu-west-1.amazoncognito.com/oauth2/token";
options.SaveTokens = true;
options.ClaimsIssuer = "https://cognito-idp.eu-west-1.amazonaws.com/ID";
options.Events = new OAuthEvents
{
//Adds Cognito id_token to Claims.
OnCreatingTicket = OnCreatingTicket
};
});
Добавление имени-идентификатора вручную:
private static Task OnCreatingTicket(OAuthCreatingTicketContext context)
{
var handler = new JwtSecurityTokenHandler();
//Cognito stores user information and Claims in the id_token.
var idToken = context.TokenResponse.Response["id_token"];
var jwtToken = handler.ReadJwtToken(idToken.ToString());
var appIdentity = new ClaimsIdentity(jwtToken.Claims);
foreach (var item in appIdentity.Claims)
{
if (item.Type == "sub")
{
var name = new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", item.Value);
var name2 = new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", item.Value);
appIdentity.AddClaim(name);
appIdentity.AddClaim(name2);
break;
}
}
context.Principal.AddIdentity(appIdentity);
return Task.CompletedTask;
}