Теперь Guava 15 добавила набор простых URL-адресов escapers .
Да, это проблема совместимости. К сожалению, ASP.NET Core не поддерживает текущую идентификационную информацию от модуля IIS (например, Easy Auth) к коду приложения. Это означает, что HttpContext.User и аналогичный код не будут работать так, как это происходит с обычным ASP.NET.
Обходной путь теперь заключается в том, чтобы вызвать конечную точку вашего веб-приложения /.auth/me из вашего кода сервера, чтобы получить заявляет пользователь. Затем вы можете кэшировать эти данные соответствующим образом, используя в качестве ключа кеша значение заголовка запроса x-ms-client-main-id. Вызов /.auth/me должен быть надлежащим образом аутентифицирован таким же образом, что вызовы вашего веб-приложения должны быть аутентифицированы (auth cookie или маркер заголовка запроса).
Я создал настраиваемое промежуточное программное обеспечение, которое заполняет свойство User до тех пор, пока это не будет устранено командой Azure.
Он считывает заголовки из Аутентификации службы приложений и создает пользователя aa, который будет распознан [Authorize]
и претендует на name
.
// Azure app service will send the x-ms-client-principal-id when authenticated
app.Use(async (context, next) =>
{
// Create a user on current thread from provided header
if (context.Request.Headers.ContainsKey("X-MS-CLIENT-PRINCIPAL-ID"))
{
// Read headers from Azure
var azureAppServicePrincipalIdHeader = context.Request.Headers["X-MS-CLIENT-PRINCIPAL-ID"][0];
var azureAppServicePrincipalNameHeader = context.Request.Headers["X-MS-CLIENT-PRINCIPAL-NAME"][0];
// Create claims id
var claims = new Claim[] {
new System.Security.Claims.Claim("http://schemas.microsoft.com/identity/claims/objectidentifier", azureAppServicePrincipalIdHeader),
new System.Security.Claims.Claim("name", azureAppServicePrincipalNameHeader)
};
// Set user in current context as claims principal
var identity = new GenericIdentity(azureAppServicePrincipalIdHeader);
identity.AddClaims(claims);
// Set current thread user to identity
context.User = new GenericPrincipal(identity, null);
};
await next.Invoke();
});
Следующий код расшифровывает токен AAD из HTTP-заголовка Azure App Service и заполняет формулу HttpContext.User. Это грубо, поскольку вы хотите кэшировать конфигурацию, а не искать ее по каждому запросу:
OpenIdConnectConfigurationRetriever r = new OpenIdConnectConfigurationRetriever();
ConfigurationManager<OpenIdConnectConfiguration> configManager = new ConfigurationManager<OpenIdConnectConfiguration>(options.Endpoint, r);
OpenIdConnectConfiguration config = await configManager.GetConfigurationAsync();
var tokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKeys = config.SigningKeys.ToList(),
ValidateIssuer = true,
ValidIssuer = config.Issuer,
ValidateAudience = true,
ValidAudience = options.Audience,
ValidateLifetime = true,
ClockSkew = new TimeSpan(0, 0, 10)
};
JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
ClaimsPrincipal principal = null;
SecurityToken validToken = null;
string token = context.Request.Headers["X-MS-TOKEN-AAD-ID-TOKEN"];
if (!String.IsNullOrWhiteSpace(token))
{
principal = handler.ValidateToken(token, tokenValidationParameters, out validToken);
var validJwt = validToken as JwtSecurityToken;
if (validJwt == null) { throw new ArgumentException("Invalid JWT"); }
if (principal != null)
{
context.User.AddIdentities(principal.Identities);
}
}
Он работает только для Azure AD. Чтобы поддерживать других поставщиков ID (Facebook, Twitter и т. Д.), Вам нужно будет обнаружить соответствующие заголовки и выяснить, как анализировать токены каждого провайдера. Тем не менее, это должны быть только вариации по указанной теме.
Я написал небольшое базовое промежуточное ПО для этого. Это создаст личность, основанную на конечной точке .auth / me. Идентификатор создается в конвейере аутентификации, чтобы атрибуты и политики [authorize] работали с идентификатором.
Вы можете найти его здесь:
https: // github. com / lpunderscore / azureappservice-authentication-middleware
или на nuget:
https://www.nuget.org/packages/AzureAppserviceAuthenticationMiddleware/
После добавления просто добавьте эту строку в ваш запуск:
app.UseAzureAppServiceAuthentication ();