Repository: microsoft/botbuilder-python

Issue:
is_skill_claim validation is not working for Anonymous authentication
## Version
4.13.0

## Describe the bug
When the skill bot doesn't have credentials set, the [is_skill_claim validation](https://github.com/microsoft/botbuilder-python/blob/main/libraries/botframework-connector/botframework/connector/auth/skill_validation.py#L62) returns false because it checks the `version_claim` before checking the `anonymous_skill_app_id`.
In [.NET](https://github.com/microsoft/botbuilder-dotnet/blob/main/libraries/Microsoft.Bot.Connector/Authentication/SkillValidation.cs#L87) and [JS](https://github.com/microsoft/botbuilder-js/blob/main/libraries/botframework-connector/src/auth/skillValidation.ts#L89) SDKs, the order of the validation is the opposite.

![image](https://user-images.githubusercontent.com/44245136/119866220-f5322780-bef2-11eb-9975-effd68690433.png)


This is causing that the EndOfConversation activities are not sent when returning `DialogTurnResult(DialogTurnStatus.Complete)` from a dialog.
This issue affects local testing when no credentials are provided for the bot.


## To Reproduce
Steps to reproduce the behavior:
1. Using the following bots: [WaterfallHostBotDotNet](https://github.com/microsoft/BotFramework-FunctionalTests/tree/main/Bots/DotNet/Consumers/CodeFirst/WaterfallHostBot) and [WaterfallSkillBotPython](https://github.com/microsoft/BotFramework-FunctionalTests/tree/main/Bots/Python/Skills/CodeFirst/WaterfallSkillBot):
2. Run the bots.
3. Open BotFramework Emulator and connect to your host bot.
4. Follow the dialog selecting: `normal` delivery mode, `Waterfall` skills, `3. WaterfallSkillBotPython`, `1. Cards` skill action and `end` option.
5. See how the bots stop responding.

![image](https://user-images.githubusercontent.com/44245136/119871635-0847f600-bef9-11eb-8c76-4ca348ce759e.png)


## Expected behavior
When selecting `end` (return `DialogTurnResult(DialogTurnStatus.Complete))` the skill bot must end the dialog sending an EOC activity to the host bot so this one can continue the dialog flow.



Discussion:

Resolving patch:
diff --git a/libraries/botframework-connector/botframework/connector/auth/skill_validation.py b/libraries/botframework-connector/botframework/connector/auth/skill_validation.py
--- a/libraries/botframework-connector/botframework/connector/auth/skill_validation.py
+++ b/libraries/botframework-connector/botframework/connector/auth/skill_validation.py
@@ -65,15 +65,15 @@ def is_skill_claim(claims: Dict[str, object]) -> bool:
         :param claims: A dict of claims.
         :return bool:
         """
-        if AuthenticationConstants.VERSION_CLAIM not in claims:
-            return False
-
         if (
             claims.get(AuthenticationConstants.APP_ID_CLAIM, None)
             == AuthenticationConstants.ANONYMOUS_SKILL_APP_ID
         ):
             return True
 
+        if AuthenticationConstants.VERSION_CLAIM not in claims:
+            return False
+
         audience = claims.get(AuthenticationConstants.AUDIENCE_CLAIM)
 
         # The audience is https://api.botframework.com and not an appId.


Test patch:
diff --git a/libraries/botframework-connector/tests/test_auth.py b/libraries/botframework-connector/tests/test_auth.py
--- a/libraries/botframework-connector/tests/test_auth.py
+++ b/libraries/botframework-connector/tests/test_auth.py
@@ -59,7 +59,7 @@ class TestAuth:
 
     @pytest.mark.asyncio
     async def test_claims_validation(self):
-        claims: List[Dict] = []
+        claims: List[Dict] = {}
         default_auth_config = AuthenticationConfiguration()
 
         # No validator should pass.