Сопоставление заявок Azure AD в моем базовом приложении AspNet [дубликат]

Теперь Guava 15 добавила набор простых URL-адресов escapers .

6
задан Vaibhav 6 January 2017 в 09:17
поделиться

4 ответа

Да, это проблема совместимости. К сожалению, ASP.NET Core не поддерживает текущую идентификационную информацию от модуля IIS (например, Easy Auth) к коду приложения. Это означает, что HttpContext.User и аналогичный код не будут работать так, как это происходит с обычным ASP.NET.

Обходной путь теперь заключается в том, чтобы вызвать конечную точку вашего веб-приложения /.auth/me из вашего кода сервера, чтобы получить заявляет пользователь. Затем вы можете кэшировать эти данные соответствующим образом, используя в качестве ключа кеша значение заголовка запроса x-ms-client-main-id. Вызов /.auth/me должен быть надлежащим образом аутентифицирован таким же образом, что вызовы вашего веб-приложения должны быть аутентифицированы (auth cookie или маркер заголовка запроса).

9
ответ дан Chris Gillum 18 August 2018 в 10:03
поделиться

Я создал настраиваемое промежуточное программное обеспечение, которое заполняет свойство 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();
});
8
ответ дан Jonas Stensved 18 August 2018 в 10:03
поделиться
  • 1
    Удивительно, спасибо, что поделились этим! – Chris Gillum 10 February 2017 в 21:23
  • 2
    @ChrisGillum Большое спасибо за это сообщение, это помогло мне. У меня был следующий вопрос. Я использую членство ASP в бэкэнд для авторизации. Добавление пользователя в Context, похоже, не подписывает их. Есть ли способ, который я мог бы вызвать SignInManager из этого же раздела кода для этого? – John Lee 21 February 2017 в 20:59

Следующий код расшифровывает токен 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 и т. Д.), Вам нужно будет обнаружить соответствующие заголовки и выяснить, как анализировать токены каждого провайдера. Тем не менее, это должны быть только вариации по указанной теме.

2
ответ дан Rhysk 18 August 2018 в 10:03
поделиться
  • 1
    Вам нужно только проанализировать JWT. Azure App Service уже проверила его. Это упростит ваше решение совсем немного. – Chris Gillum 21 February 2017 в 22:53

Я написал небольшое базовое промежуточное ПО для этого. Это создаст личность, основанную на конечной точке .auth / me. Идентификатор создается в конвейере аутентификации, чтобы атрибуты и политики [authorize] работали с идентификатором.

Вы можете найти его здесь:

https: // github. com / lpunderscore / azureappservice-authentication-middleware

или на nuget:

https://www.nuget.org/packages/AzureAppserviceAuthenticationMiddleware/

После добавления просто добавьте эту строку в ваш запуск:

app.UseAzureAppServiceAuthentication ();

4
ответ дан user3159405 18 August 2018 в 10:03
поделиться
  • 1
    Я посмотрел на репо и безуспешно пробовал. Мне кажется, что вы не пропустите заголовки, такие как X-ZUMO-AUTH, в /.auth/me. вы отправляете файлы cookie. может ли это быть проблемой? – n00b 26 March 2017 в 06:22
  • 2
    Этот GitHub Repo обновляется, чтобы работать с заголовками. Я успешно использовал его в своем приложении – n00b 28 March 2017 в 10:53
  • 3
    @ n00b thx за вклад, ваши изменения были объединены, я буду обновлять nuget, как только у меня будет время. – user3159405 30 March 2017 в 00:07
Другие вопросы по тегам:

Похожие вопросы: