Как функция Azure 2.x может получить доступ к stable_sid? - PullRequest
0 голосов
/ 17 февраля 2019

Когда я закодировал свою функцию Azure с использованием v1, я смог получить доступ к sid пользователя следующим образом:

public static bool TryGetUserId(out string userId)
{
    userId = string.Empty;

    IPrincipal currentPrincipal = ClaimsPrincipal.Current;

    if (currentPrincipal is null)
        return false;

    userId = currentPrincipal.GetNameIdentifier();

    return false == string.IsNullOrWhiteSpace(userId);
}

Затем я переместил свою функцию Azure в предварительный просмотр v2 и прочитал, что ClaimsPrincipal больше не гидратировался .Я закончил, используя следующий алгоритм:

public static bool TryGetUserId(HttpRequestMessage request, out string userId)
{
    userId = string.Empty;

    KeyValuePair<string, IEnumerable<string>> principalId = request.Headers.FirstOrDefault(header => string.Equals(header.Key, "X-MS-CLIENT-PRINCIPAL-ID", StringComparison.InvariantCulture));

    if (principalId.Value.Count() != 1)
         return false;

    userId = principalId.Value.First();

    return false == string.IsNullOrWhiteSpace(userId);
}

Вот пример моей функции Azure:

[FunctionName("FindAccount")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequestMessage request, ILogger logger)
{
    try
    {
        if (false == FunctionHelper.TryGetUserId(request, out userId))
            return new HttpResponseMessage(HttpStatusCode.Unauthorized);

        // Looks for an account matching the sid.
    }
    catch (AccountNotFoundException)
    {
        logger.LogInformation($"No account has been found for user.");

        return new HttpResponseMessage(HttpStatusCode.NoContent);
    }
}

Она больше не работает, так как заголовок больше не является sid, но либоlong или int значение, использую ли я учетную запись Google или учетную запись Microsoft.

Настройка

У меня есть приложение для iOS, которое направляет пользователя налибо Google или Microsoft для аутентификации, а затем приложение iOS подключает функцию Azure к определенным конечным точкам (/.auth/login/microsoftaccount или /.auth/login/google) для отправки полученных токенов, как описано в документации Microsoft .

Вопрос

Как функция Azure v2 может получить доступ к sid?

пользователя

1 Ответ

0 голосов
/ 18 февраля 2019

Попробуйте использовать следующий подход и следуйте документации .Это подробно обсуждалось с фрагментами кода.

public static async Task<IActionResult>  Run(HttpRequest req, ILogger log, ClaimsPrincipal principal)
{
    log.LogInformation("C# HTTP trigger function processed a request."); 

    var isAuthenticated = principal.Identity.IsAuthenticated; 
    var idName = string.IsNullOrEmpty(principal.Identity.Name) ? "null" : principal.Identity.Name;
    log.LogInformation($"principal.Identity.IsAuthenticated = '{isAuthenticated}' and principal.Identity.Name = '{idName}'");
    var owner = (principal.FindFirst(ClaimTypes.NameIdentifier))?.Value;
    
    return new OkObjectResult($"principal.Identity.IsAuthenticated = '{isAuthenticated}' and principal.Identity.Name = '{idName}'");
    
}

private static string GetIdentityString(ClaimsIdentity identity)
{
    var userIdClaim = identity.FindFirst(ClaimTypes.NameIdentifier);
    if (userIdClaim != null)
    {
        // user identity
        var userNameClaim = identity.FindFirst(ClaimTypes.Name);
        return $"Identity: ({identity.AuthenticationType}, {userNameClaim?.Value}, {userIdClaim?.Value})";
    }
    else
    {
        // key based identity
        var authLevelClaim = identity.FindFirst("http://schemas.microsoft.com/2017/07/functions/claims/authlevel");
        var keyIdClaim = identity.FindFirst("http://schemas.microsoft.com/2017/07/functions/claims/keyid");
        return $"Identity: ({identity.AuthenticationType}, {authLevelClaim?.Value}, {keyIdClaim?.Value})";
    }
}
...