Пример аутентификации клиентского приложения OData с помощью службы приложений Azure - PullRequest
0 голосов
/ 19 ноября 2018

Есть ли пример того, как внешний клиент OData использует AAD для доступа к службе приложений Azure, выступающей в качестве сервера OData?Предоставляемое удостоверение относится к самому клиентскому приложению, зарегистрированному в AAD как собственное приложение, а не как пользователь, поэтому в приложении не требуется интерфейс аутентификации пользователя.

1 Ответ

0 голосов
/ 27 ноября 2018

Фактически, это то же самое, что и обычный веб-API для настройки AD для службы Odata.Таким образом, вы можете обратиться к этому примеру: https://github.com/azure-samples/active-directory-dotnet-daemon

Незначительное различие на стороне клиента.Поскольку код клиента генерируется «Генератором кода клиента Odata», он не использует класс клиента HTTP.Вам нужно использовать DataServiceContext.SendingRequest Event , чтобы добавить заголовок авторизации.

См. Код ниже:

private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
    private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"];
    private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
    private static string appKey = ConfigurationManager.AppSettings["ida:AppKey"];
    private static string OdataServiceId = ConfigurationManager.AppSettings["OdataTestId"];

    static string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

    private static AuthenticationContext authContext = null;
    private static ClientCredential clientCredential = null;
    // Get an entire entity set.
    static void ListAllProducts(Default.Container container)
    {
        foreach (var p in container.Products)
        {
            Console.WriteLine("{0} {1} {2}", p.Name, p.Price, p.Category);
        }
    }

    static void AddProduct(Default.Container container, OdataTest.Models.Product product)
    {

        container.SendingRequest2 += Container_SendingRequest2;
        container.AddToProducts(product);
        var serviceResponse = container.SaveChanges();
        foreach (var operationResponse in serviceResponse)
        {
            Console.WriteLine("Response: {0}", operationResponse.StatusCode);
        }
    }

    private static void Container_SendingRequest2(object sender, Microsoft.OData.Client.SendingRequest2EventArgs e)
    {
        AuthenticationResult result= authContext.AcquireTokenAsync(OdataServiceId, clientCredential).Result;
        e.RequestMessage.SetHeader("Authorization", "Bearer " + result.AccessToken);
    }

    static void Main(string[] args)
    {
        authContext = new AuthenticationContext(authority);
        clientCredential = new ClientCredential(clientId, appKey);
        // TODO: Replace with your local URI.
        string serviceUri = "http://localhost:59837/";
        var container = new Default.Container(new Uri(serviceUri));

        var product = new OdataTest.Models.Product()
        {
            Name = "Yo-yo",
            Category = "Toys",
            Price = 4.95M
        };

        AddProduct(container, product);
        ListAllProducts(container);
        Console.ReadKey();

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...