### Description

At the moment the Azure Data Factory hook only supports `TokenCredential` (service principal client ID and secret). It would be very useful to have support for other authentication types like managed identity. Preferably, we would create a `DefaultTokenCredential` if the client ID and secret are not provided in the connection.

### Use case/motivation

We're using Airflow on Azure Kubernetes Service and this would allow us to use the pod identity for authentication which is a lot cleaner than creating a service principal.

### Related issues

_No response_

### Are you willing to submit a PR?

- [X] Yes I am willing to submit a PR!

### Code of Conduct

- [X] I agree to follow this project's [Code of Conduct](https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md)

airflow/providers/microsoft/azure/hooks/data_factory.py
self._conn: DataFactoryManagementClient = None
        self.conn_id = azure_data_factory_conn_id
        super().__init__()
    def get_conn(self) -> DataFactoryManagementClient:
        if self._conn is not None:
            return self._conn
        conn = self.get_connection(self.conn_id)
        tenant = conn.extra_dejson.get('extra__azure_data_factory__tenantId')
        subscription_id = conn.extra_dejson.get('extra__azure_data_factory__subscriptionId')
        self._conn = DataFactoryManagementClient(
            credential=ClientSecretCredential(
                client_id=conn.login, client_secret=conn.password, tenant_id=tenant
            ),
            subscription_id=subscription_id,
        )
        return self._conn
    @provide_targeted_factory
    def get_factory(
        self, resource_group_name: Optional[str] = None, factory_name: Optional[str] = None, **config: Any
    ) -> Factory:
        """
        Get the factory.
        :param resource_group_name: The resource group name.
        :param factory_name: The factory name.
        :param config: Extra parameters for the ADF client.
        :return: The factory.
        """
        return self.get_conn().factories.get(resource_group_name, factory_name, **config)
    def _factory_exists(self, resource_group_name, factory_name) -> bool: