SecurityTokenInvalidAudienceException: IDX10214: сбой проверки аудитории
Я разрабатываю приложение ASP.NET Core 2 с использованием Identity и Sustainsys.Saml2 (для проверки подлинности SAML). Я сделал необходимые конфигурации в файле Startup.cs. Теперь, когда я запускаю проект и пытаюсь войти в систему, используя SAML2 (в качестве внешнего входа), я получаю следующую ошибку после ввода своих учетных данных:
SecurityTokenInvalidAudienceException: IDX10214: сбой проверки аудитории. Аудитория: "[PII скрыт]". Не соответствует: validationParameters.ValidAudience: '[PII скрыт]' или validationParameters.ValidAudiences: '[PII скрыт]'. Microsoft.IdentityModel.Tokens.Validators.ValidateAudience(IEnumerable аудитории, SecurityToken SecurityToken, TokenValidationParameters validationParameters) Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler.ValidateConditions(Saml2SecurityToken samlToken, TokenValidationParameters validationParameters) Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler.ValidateToken(строка token, TokenValidationParameters validationParameters, out SecurityToken validatedToken) Sustainsys.Saml2.Saml2P.Saml2Response+d__60.MoveNext() System.Collections.Generic.List..ctor(коллекция IEnumerable) System.Linq.oist.Saml2P.Saml2Response.GetClaims(параметры IOptions, IDictionary relayData) Sustainsys.Saml2.WebSso.AcsCommand.ProcessResponse(параметры IOptions, Saml2Response samlResponse, StoredRequestState.RegSec. Saml2.AspNetCore2.Saml2 Обработчик +d__12.MoveNext() System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача-задача) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи) CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача-задачи) Microsoft.AspNetCore.Diagnostics.EntityFramework. System..MoveNext () System.Runtime.CompilerServices.Task Awaiter.ThrowForNonSuccess (Задача) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Задача) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware+d__7.MoveNext()
Я не понимаю, что это значит. Я что-то пропустил?
Вот что у меня в файле автозагрузки
services.AddAuthentication()
.AddSaml2(options =>
{
var spOptions = new SPOptions
{
EntityId = new EntityId("https://localhost:44373/Saml2"),
ReturnUrl = new Uri("https://localhost:44373"),
MinIncomingSigningAlgorithm = "http://www.w3.org/2000/09/xmldsig#rsa-sha1",
};
options.SPOptions = spOptions;
options.IdentityProviders.Add(new IdentityProvider(new EntityId("https://www.example.com/SSO/SAML/App"), options.SPOptions)
{
AllowUnsolicitedAuthnResponse = false,
MetadataLocation = "https://www.example.com/SSO/SAMLMetadata/App",
LoadMetadata = true,
});
});
Заранее спасибо...
3 ответа
Насколько я знаю, эта ошибка ясно говорит о том, что аудитория, пришедшая на ваш SAML-токен, отличается от значения в вашей конфигурации запуска. Может быть полезно сравнить эти значения. Иногда проверка не проходит из-за сравнения с учетом регистра, поэтому вам следует обратить внимание, в этом случае ваша аудитория находится в токене и конфигурации.
Согласно исходному коду ( Saml2Response) и, как указал Anders Abel, ValidAudience
свойство инициализируется из SPOptions.EntityId
что вы настраиваете здесь:
var spOptions = new SPOptions
{
EntityId = new EntityId("https://localhost:44373/Saml2"),
ReturnUrl = new Uri("https://localhost:44373"),
MinIncomingSigningAlgorithm = "http://www.w3.org/2000/09/xmldsig#rsa-sha1",
};
Так что вы должны сравнить EntityId
значение, которое вы настроили со значением в вашем saml-токене, который может выглядеть следующим образом:
<saml:Audience>The value here should be the same as in your startup configuration</saml:Audience>
IDX10214
: проверьте этот раздел, если вы используете
Microsoft.Identity.Web
версия 1.4.1 или аналогичная, и вы получаете это исключение (буквально скопированное, и вам нужно изменить уровни журнала, чтобы увидеть это):
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[1]
Failed to validate the token.
Microsoft.IdentityModel.Tokens.SecurityTokenInvalidAudienceException: IDX10214: Audience validation failed. Audiences: 'System.String'. Did not match: validationParameters.ValidAudience: 'System.String' or validationParameters.ValidAudiences: 'System.String'.
at Microsoft.IdentityModel.Tokens.Validators.ValidateAudience(IEnumerable`1 audiences, SecurityToken securityToken, TokenValidationParameters validationParameters)
at Microsoft.Identity.Web.Resource.RegisterValidAudience.ValidateAudience(IEnumerable`1 audiences, SecurityToken securityToken, TokenValidationParameters validationParameters)
at Microsoft.IdentityModel.Tokens.Validators.ValidateAudience(IEnumerable`1 audiences, SecurityToken securityToken, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateAudience(IEnumerable`1 audiences, JwtSecurityToken jwtToken, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateTokenPayload(JwtSecurityToken jwtToken, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken)
at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
Было бы гораздо полезнее увидеть ценность этих
System.String
с. И если бы не имело значения, используете ли вы GUID или что-то запоминающееся и читаемое.
По сути, вы должны добавить
Audience
собственность на
appsettings.json
и это должно быть равно значению на портале Azure. Мне не повезло со взломом
ClientId
и чтобы это соответствовало
Application ID URI
. Это не окончательное решение - AFAIK, которое все еще должно быть равно
Application (client) ID
на портале Azure, т. е. GUID без префиксов и суффиксов.
в моем случае эмитент и аудитория для JwtSecurityToken были опущены. В моем производном классе UserService: IUserService я определил переменные эмитента и аудитории в функции generateJwtToken. Эти переменные должны соответствовать переменным services.AddJwtBearer в файле startup.csv для ValidIssuer и ValidAudience. см. (https://dotnetcoretutorials.com/2020/01/15/creating-and-validating-jwt-tokens-in-asp-net-core/).
цитировать:
The Issuer and Audience are funny things because realistically, you probably won’t have a lot of use for them. Issuer is “who” created this token, for example your website, and Audience is “who” the token is supposed to be read by. So a good example might be that when a user logs in, your authentication api (auth.mywebsite.com) would be the issuer, but your general purposes API is the expected audience (api.mywebsite.com). These are actually free text fields so they don’t have to be anything in particular, but later on when we validate the issuer/audience, we will need to know what they are.
открытый класс UserService: IUserService {
private string generateJwtToken(long userId)
{
var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_appSettings.Secret));
var signinCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256);
var tokenOptions = new JwtSecurityToken(
issuer: "http://localhost:5000",
audience: "http://localhost:5000",
claims: new List<Claim> {
new Claim(ClaimTypes.Name, userId.ToString()),
new Claim(ClaimTypes.Role, "Operator")
},
expires: DateTime.UtcNow.AddDays(7),
signingCredentials: signinCredentials
);
var tokenString = new JwtSecurityTokenHandler().WriteToken(tokenOptions);
return tokenString;
}
}
startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(opt =>
{
opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(opt =>
{
opt.RequireHttpsMetadata = false;
opt.SaveToken = true;
opt.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidIssuer = "http://localhost:5000",
ValidAudience = "http://localhost:5000"
};
});
}