Проблема с перезаписью базовой аутентификации Azure API Management - PullRequest
0 голосов
/ 06 июля 2019

Когда я перезаписываю базовую аутентификацию управления API по нескольким причинам, у меня возникает ошибка, приведенная ниже, и устраняется исправление.

Кто-нибудь знает правильные политики управления API?Спасибо.

Политики

<policies>
    <inbound>
        <set-variable name="isAuthOk" 
value="@{
    string[] value;
    BasicAuthCredentials credit;
  if (context.Request.Headers.TryGetValue("Authorization", out value))
  {
     if(TryParseBasic(value[0], out credit)){
        if(credit.UserId == "nelco1"){
            return true;
        }else{
            return false;
        }
     }
  }
  else
  {
    return false;
  }
}" />
        <base />
        <!-- thankx for https://stackoverflow.com/questions/49479416/api-management-basic-authentication -->
        <choose>
            <when condition="@(context.Variables.GetValueOrDefault<bool>("isAuthOk"))">
            </when>
            <otherwise>
                <return-response>
                    <set-status code="401" reason="Unauthorized" />
                    <set-header name="WWW-Authenticate" exists-action="override">
                        <value>Basic realm="ohhhhhhhhh"</value>
                    </set-header>
                    <set-body>Wrong username or password</set-body>
                </return-response>
            </otherwise>
        </choose>
        <set-backend-service id="apim-generated-policy" backend-id="preaddresscode2" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

У меня ошибка при сохранении вышеуказанных политик

One or more fields contain incorrect values:
Error in element 'set-variable' on line 3, column 10: The name 'TryParseBasic' does not exist in the current context

MS Docs

https://docs.microsoft.com/en-us/azure/api-management/api-management-policy-expressions

В документе существует метод TryParseBasic.

1 Ответ

1 голос
/ 09 июля 2019

Спасибо, Томас.Это сработало, когда я его реализовал, ссылаясь на токен JWT .

Я удалился, используя TryParseBasic вместо AsBasic.

<policies>
    <inbound>
        <set-backend-service id="apim-generated-policy" backend-id="preaddresscode2" />
        <rewrite-uri template="/HttpTrigger1" />
        <set-variable name="isAuthOk" value="@{
    string[] value;
  if (context.Request.Headers.TryGetValue("Authorization", out value))
  {
    BasicAuthCredentials credit = context.Request.Headers.GetValueOrDefault("Authorization","").AsBasic();
    if(credit == null){
        return false;
    }
    switch(credit.UserId){
        case "UUUUUU1":
            // it seems an ugly implementation.
            if(credit.Password.Equals("PPPPPP1")){
                return true;
            }
        case "UUUUUU2":
            if(credit.Password.Equals("PPPPPP2")){
                return true;
            }
        break;
            default:
        break;        
    }
    return false;
  }
  else
  {
    return false;
  }
  return true;
        }" />
        <base />
        <choose>
            <when condition="@(context.Variables.GetValueOrDefault<bool>("isAuthOk"))" />
            <otherwise>
                <return-response>
                    <set-status code="401" reason="Unauthorized" />
                    <set-header name="WWW-Authenticate" exists-action="override">
                        <value>Basic realm="someRealm"</value>
                    </set-header>
                    <set-body>Wrong username or password</set-body>
                </return-response>
            </otherwise>
        </choose>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>
...