日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】在无人值守程序(服务)中调用Microsoft Graph

發布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】在无人值守程序(服务)中调用Microsoft Graph 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是無人值守程序(服務)

我在此前用了幾篇文章分別介紹了在桌面應用程序(控制臺),Web應用程序(ASP.NET MVC),以及PowerSehll腳本中如何訪問Microsoft Graph,今天這一篇要繼續講一個場景:在無人值守程序中訪問Microsoft Graph。那么什么是無人值守程序呢?通常我們將此類程序定義為不需要(不允許)用戶進行干預,一般用來在后臺自動化運行的程序。在英文文檔中,我們將其稱之為daemon application,廣義上說,也包括了服務這種特殊的應用程序。

無人值守程序與Microsoft Graph的集成,要遵守一般的流程,但也有自己的一些特點,總結起來有如下的步驟

  • 注冊應用程序
  • 配置應用程序權限
  • 獲得管理員同意
  • 獲得訪問令牌
  • 使用令牌訪問資源
  • 關于這個話題,官方有一個英文的文檔,請參考?https://developer.microsoft.com/en-us/graph/docs/concepts/auth_v2_service

    注冊應用程序

    針對Azure AD的不同版本,注冊應用程序的過程我此前已經有專門的文章介紹了,請參考

  • 注冊Azure AD 2.0應用程序(支持國際版,支持Office 365賬號以及個人賬號登錄,功能可能有所缺失,但這個是以后的方向),文章鏈接
  • 注冊Azure AD 1.0應用程序(支持國際版和中國版,僅支持Office 365賬號登錄,功能最全),文章鏈接1,文章鏈接2
  • 本文先演示注冊Azure AD 2.0應用,具體的步驟就不做截圖了,唯一要提醒的是

  • 應用程序類型設置為Web
  • ReplyUrl可以設置為一個通用的地址,我喜歡設置為?https://developer.microsoft.com/en-us/graph/
  • 配置應用程序權限

    這是無人值守應用程序注冊的時候,要特別注意的。由于該程序是沒有用戶參與的,所以它無法使用某個特定用戶的身份做什么事情,而是使用一個統一的身份,該身份我們稱為Application Identity,而相應的,我們要為程序申請的權限也是所謂的“Application Permissions”,而不是“Delegated Permissions”。

    本例中,我想為應用程序申請兩個權限:一個是用來獲取所有用戶信息的,另外一個是用來代替任何用戶發送郵件。

    獲得管理員同意

    由于無人值守的程序其實是自動化運行的,無需用戶進行參與進行授權,而它進行的操作,卻又有可能要代表用戶的行為。所以通常這些權限都需要得到真正的Office 365 Tenant管理員同意才能真正生效。

    其實細心的朋友在上圖中也應該可以看出來,幾乎所有Application Permission都是需要管理員同意的(Admin Consent)

    要獲得管理員同意,你可以將下面的這個鏈接發送給用戶的Office 365 Tenant管理員

    https://login.microsoftonline.com/common/adminconsent?client_id=dff48006-b010-4859-b5d5-68acdb821322&state=12345&redirect_uri=https://developer.microsoft.com/en-us/graph/

    管理員需要在下面這樣的界面中對應用程序所申請的權限進行確認

    正常情況下,完成授權后頁面會被導航到下面的地址,請確認admin_consent的值為true,并記錄下來tenant的值。這個表示用戶的Office 365 Tenant的編號,后面我們需要用到。

    https://developer.microsoft.com/en-us/graph/?admin_consent=True&tenant=59723f6b-2d14-49fe-827a-8d04f9fe7a68&state=12345

    獲取訪問令牌

    無人值守應用程序,不需要用戶參與進行授權,所以它獲取令牌的方式也略有不同。你可以在應用程序里面使用下面的方式發起一個POST請求來獲得訪問令牌(Access Token)。

    POST https://login.windows.net/59723f6b-2d14-49fe-827a-8d04f9fe7a68/oauth2/token Content-Type: application/x-www-form-urlencoded Host: login.windows.netclient_id=338c8e70-d0da-444e-b877-9f427a16eb17&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret=8V59e4aBfNr6x4lN8EAMTisk3J7WRH+glZbvgMwdDQY=&grant_type=client_credentials

    正常情況下,這個請求將返回如下的結果

    請復制得到的這個access_token的值。請注意,默認情況下,這個access_token會在1個小時后過期。至于怎么刷新token,我會在后續文章中介紹。

    使用令牌訪問資源

    有了這個access_token,應用程序就可以盡情地訪問Microsoft Graph的資源了。例如,通過下面的請求可以獲取到對應的Office 365 Tenant中的所有用戶信息。

    使用一個控制臺程序來實現代碼邏輯

    上面演示的時候,我用了Fiddler這個小工具來模擬發起請求,并且快速地查看到結果。下面用一個簡單的應用程序,來實現代碼邏輯,給大家參考。

    這個程序使用了最簡單的代碼實現,并添加了Newtonsoft.Json這個Package

    using Newtonsoft.Json.Linq; using System; using System.Net.Http;namespace daemonapplication {class Program{static void Main(string[] args){//準備環境var clientId = "dff48006-b010-4859-b5d5-68acdb821322";var client_secret = "uxO3frQOekCfdOfX2Oom4Vc";var tenantId = "59723f6b-2d14-49fe-827a-8d04f9fe7a68";var client = new HttpClient();//獲得令牌var request = new HttpRequestMessage(HttpMethod.Post, $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token");var body = new StringContent($"grant_type=client_credentials&client_id={clientId}&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret={client_secret}");body.Headers.ContentType.MediaType = "application/x-www-form-urlencoded";request.Content = body;var access_token = JObject.Parse(client.SendAsync(request).Result.Content.ReadAsStringAsync().Result)["access_token"].ToString();//訪問資源request = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/users");request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", access_token);var users = JObject.Parse(client.SendAsync(request).Result.Content.ReadAsStringAsync().Result)["value"];foreach (var item in users){Console.WriteLine($"displayName:{item["displayName"]},email:{item["email"]}");}Console.Read();}} }

    使用Azure AD 1.0

    上面的例子很簡單易懂,但如果我們使用的是Azure AD 1.0(國際版同時支持1.0和2.0,中國版則只支持1.0),則注冊應用程序和使用Microsoft Graph的方式會略有不同。

    注冊Azure 1.0 應用程序(中國版)

    請參考之前的兩篇文章了解如何在Azure 1.0的環境中注冊應用程序

  • 國際版?鏈接
  • 中國版?鏈接
  • 和上面提到的一樣,有兩點需要注意

  • 應用程序類型設置為Web
  • ReplyUrl可以設置為一個通用的地址,我喜歡設置為?https://developer.microsoft.com/en-us/graph/
  • 配置Azure 1.0 應用程序權限(中國版)

    和上面提到的一樣,這里需要申請Application permission,而不是delegation permission

    這里需要注意修改Manifest文件(先下載,然后編輯,最后上傳),允許隱式授權?

    獲得管理員同意 (中國版)

    和Azure AD 2.0明顯不同的是,在1.0中,獲取管理員同意,需要使用如下的鏈接

    https://login.chinacloudapi.cn/12c0cdab-3c40-4e86-80b9-3e6f98d2d344/oauth2/authorize?prompt=admin_consent&response_type=token&redirect_uri=https://developer.microsoft.com/en-us/graph/&resource=https://microsoftgraph.chinacloudapi.cn&client_id=3f56a5d5-7882-4290-9fd8-3908d734b3fe

    此處的關鍵在于有一個prompt=admin_consent的參數,正常情況下,管理員進行授權確認后會跳轉到下面這樣的地址,里面已經包含了一個access_token

    https://developer.microsoft.com/en-us/graph/#access_token=eyJ0eXAiOiJKV1QiLCJub25jZSI6IkFRQUJBQUFBQUFDckhLdnJ4N0cyU2FaYlpoLXREbnA3Z1BvSDFZc2w5MWlxU0x4Qmdqc1ZXODhmMDR5Vm11Tm1pZGlWZGFJclY5MEhLTl9aUXlXMENERlowcWdwRnBfOWw4Wkhpb21LdkNSM19LQURMdWZ3R1NBQSIsImFsZyI6IlJTMjU2IiwieDV0IjoiWTFjenBtLXhpY2FRVFZYQzlPU2JXN3pHeHRRIiwia2lkIjoiWTFjenBtLXhpY2FRVFZYQzlPU2JXN3pHeHRRIn0.eyJhdWQiOiJodHRwczovL21pY3Jvc29mdGdyYXBoLmNoaW5hY2xvdWRhcGkuY24iLCJpc3MiOiJodHRwczovL3N0cy5jaGluYWNsb3VkYXBpLmNuLzEyYzBjZGFiLTNjNDAtNGU4Ni04MGI5LTNlNmY5OGQyZDM0NC8iLCJpYXQiOjE0OTYyNDI0MjQsIm5iZiI6MTQ5NjI0MjQyNCwiZXhwIjoxNDk2MjQ2MzI0LCJhY3IiOiIxIiwiYWlvIjoiQVNRQTIvOEFBQUFBd2E2S3Y1YmVVRGtSVTliY2pBTzBKbFVJb0xaYzk3bEtkYW5hbzRzMFJTVT0iLCJhbXIiOlsicHdkIl0sImFwcF9kaXNwbGF5bmFtZSI6ImRlYW1vbiIsImFwcGlkIjoiM2Y1NmE1ZDUtNzg4Mi00MjkwLTlmZDgtMzkwOGQ3MzRiM2ZlIiwiYXBwaWRhY3IiOiIwIiwiZmFtaWx5X25hbWUiOiLpmYgiLCJnaXZlbl9uYW1lIjoi5biM56ugIiwiaXBhZGRyIjoiMTgwLjE1Mi4yMi41MiIsIm5hbWUiOiLpmYgg5biM56ugIiwib2lkIjoiZjU1MjRmMTAtYTNlYy00Njg3LTllMzktNWFkNmU1ZTY3MDVhIiwicGxhdGYiOiIzIiwicHVpZCI6IjIwMDM3RkZFODExNjMyMDUiLCJzY3AiOiJNYWlsLlNlbmQgVXNlci5SZWFkLkFsbCIsInN1YiI6InhpckVWTFBtVG1BRFpJTW1sZTdBajZwS0NQU2JHMlNGU3EzN3JQaV9rWkUiLCJ0aWQiOiIxMmMwY2RhYi0zYzQwLTRlODYtODBiOS0zZTZmOThkMmQzNDQiLCJ1bmlxdWVfbmFtZSI6ImFyZXNAbW9kdHNwLnBhcnRuZXIub25tc2NoaW5hLmNuIiwidXBuIjoiYXJlc0Btb2R0c3AucGFydG5lci5vbm1zY2hpbmEuY24iLCJ1dGkiOiJRSEswVy0xdXcwbTlxWW9TekNvRUFBIiwidmVyIjoiMS4wIn0.EZhZhKFXzS1hVkz5HNEFSG9lcL6CSRyjqRNEMTYpM0Q4wp7UICf1_61PQFCe_5opnZlEMl-e7sHJ2W4Ni1hqjASUxOamFoQ5pBVNQ-WgEfhX_QPJXLBbyMdFguRPdrXy1AqzYGqFQ_mtmjqFa0w7nXf4LI7vgx7MRPMm5YDljnK4vk4oXC9M7fb4EcU7g26XrBUnTz6Es_IGT9SUqAXYLDjfI3dC06GqtjRrTwtd0AYwbbUPZ288j4XZ_fb8x1lj97ZpIFZh-STnIZUatIij0dFphMrFhUig0YbMtCxlfsrpZgPyuwlrrXbnj5fgWw1ABj3xKrEaWbVt5XCT4T9-aA&token_type=Bearer&expires_in=3599&session_state=022f05fb-4b3f-4f86-b593-cbda90232a7a&admin_consent=True

    獲取訪問令牌(中國版)

    這一步可以跳過,因為上面這一步已經獲得了access_token

    使用令牌訪問資源(中國版)

    using System; using System.Net.Http; using System.Threading.Tasks;namespace ConsoleApp6 {class Program{static void Main(string[] args){var result = GetUsers().Result;Console.WriteLine(result);Console.Read();}static async Task<string> GetUsers(){var token = "eyJ0eXAiOiJKV1QiLCJub25jZSI6IkFRQUJBQUFBQUFDckhLdnJ4N0cyU2FaYlpoLXREbnA3Z1BvSDFZc2w5MWlxU0x4Qmdqc1ZXODhmMDR5Vm11Tm1pZGlWZGFJclY5MEhLTl9aUXlXMENERlowcWdwRnBfOWw4Wkhpb21LdkNSM19LQURMdWZ3R1NBQSIsImFsZyI6IlJTMjU2IiwieDV0IjoiWTFjenBtLXhpY2FRVFZYQzlPU2JXN3pHeHRRIiwia2lkIjoiWTFjenBtLXhpY2FRVFZYQzlPU2JXN3pHeHRRIn0.eyJhdWQiOiJodHRwczovL21pY3Jvc29mdGdyYXBoLmNoaW5hY2xvdWRhcGkuY24iLCJpc3MiOiJodHRwczovL3N0cy5jaGluYWNsb3VkYXBpLmNuLzEyYzBjZGFiLTNjNDAtNGU4Ni04MGI5LTNlNmY5OGQyZDM0NC8iLCJpYXQiOjE0OTYyNDI0MjQsIm5iZiI6MTQ5NjI0MjQyNCwiZXhwIjoxNDk2MjQ2MzI0LCJhY3IiOiIxIiwiYWlvIjoiQVNRQTIvOEFBQUFBd2E2S3Y1YmVVRGtSVTliY2pBTzBKbFVJb0xaYzk3bEtkYW5hbzRzMFJTVT0iLCJhbXIiOlsicHdkIl0sImFwcF9kaXNwbGF5bmFtZSI6ImRlYW1vbiIsImFwcGlkIjoiM2Y1NmE1ZDUtNzg4Mi00MjkwLTlmZDgtMzkwOGQ3MzRiM2ZlIiwiYXBwaWRhY3IiOiIwIiwiZmFtaWx5X25hbWUiOiLpmYgiLCJnaXZlbl9uYW1lIjoi5biM56ugIiwiaXBhZGRyIjoiMTgwLjE1Mi4yMi41MiIsIm5hbWUiOiLpmYgg5biM56ugIiwib2lkIjoiZjU1MjRmMTAtYTNlYy00Njg3LTllMzktNWFkNmU1ZTY3MDVhIiwicGxhdGYiOiIzIiwicHVpZCI6IjIwMDM3RkZFODExNjMyMDUiLCJzY3AiOiJNYWlsLlNlbmQgVXNlci5SZWFkLkFsbCIsInN1YiI6InhpckVWTFBtVG1BRFpJTW1sZTdBajZwS0NQU2JHMlNGU3EzN3JQaV9rWkUiLCJ0aWQiOiIxMmMwY2RhYi0zYzQwLTRlODYtODBiOS0zZTZmOThkMmQzNDQiLCJ1bmlxdWVfbmFtZSI6ImFyZXNAbW9kdHNwLnBhcnRuZXIub25tc2NoaW5hLmNuIiwidXBuIjoiYXJlc0Btb2R0c3AucGFydG5lci5vbm1zY2hpbmEuY24iLCJ1dGkiOiJRSEswVy0xdXcwbTlxWW9TekNvRUFBIiwidmVyIjoiMS4wIn0.EZhZhKFXzS1hVkz5HNEFSG9lcL6CSRyjqRNEMTYpM0Q4wp7UICf1_61PQFCe_5opnZlEMl-e7sHJ2W4Ni1hqjASUxOamFoQ5pBVNQ-WgEfhX_QPJXLBbyMdFguRPdrXy1AqzYGqFQ_mtmjqFa0w7nXf4LI7vgx7MRPMm5YDljnK4vk4oXC9M7fb4EcU7g26XrBUnTz6Es_IGT9SUqAXYLDjfI3dC06GqtjRrTwtd0AYwbbUPZ288j4XZ_fb8x1lj97ZpIFZh-STnIZUatIij0dFphMrFhUig0YbMtCxlfsrpZgPyuwlrrXbnj5fgWw1ABj3xKrEaWbVt5XCT4T9-aA";HttpClient client = new HttpClient();client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);HttpResponseMessage response = await client.GetAsync("https://microsoftgraph.chinacloudapi.cn/v1.0/users/");string retResp = await response.Content.ReadAsStringAsync();return retResp;}} }

    如果我們將代碼再演化一下,使用Microsoft.Graph進行訪問的話,會更加輕松愜意,因為可以完全基于強類型的方式進行操作

    using Microsoft.Graph; using System; using System.Threading.Tasks; using System.Linq;namespace ConsoleApp6 {class Program{static void Main(string[] args){var result = GetUsers().Result;foreach (var item in result){Console.WriteLine(item.DisplayName);}Console.Read();}static async Task<IGraphServiceUsersCollectionPage> GetUsers(){var token = "eyJ0eXAiOiJKV1QiLCJub25jZSI6IkFRQUJBQUFBQUFDckhLdnJ4N0cyU2FaYlpoLXREbnA3Z1BvSDFZc2w5MWlxU0x4Qmdqc1ZXODhmMDR5Vm11Tm1pZGlWZGFJclY5MEhLTl9aUXlXMENERlowcWdwRnBfOWw4Wkhpb21LdkNSM19LQURMdWZ3R1NBQSIsImFsZyI6IlJTMjU2IiwieDV0IjoiWTFjenBtLXhpY2FRVFZYQzlPU2JXN3pHeHRRIiwia2lkIjoiWTFjenBtLXhpY2FRVFZYQzlPU2JXN3pHeHRRIn0.eyJhdWQiOiJodHRwczovL21pY3Jvc29mdGdyYXBoLmNoaW5hY2xvdWRhcGkuY24iLCJpc3MiOiJodHRwczovL3N0cy5jaGluYWNsb3VkYXBpLmNuLzEyYzBjZGFiLTNjNDAtNGU4Ni04MGI5LTNlNmY5OGQyZDM0NC8iLCJpYXQiOjE0OTYyNDI0MjQsIm5iZiI6MTQ5NjI0MjQyNCwiZXhwIjoxNDk2MjQ2MzI0LCJhY3IiOiIxIiwiYWlvIjoiQVNRQTIvOEFBQUFBd2E2S3Y1YmVVRGtSVTliY2pBTzBKbFVJb0xaYzk3bEtkYW5hbzRzMFJTVT0iLCJhbXIiOlsicHdkIl0sImFwcF9kaXNwbGF5bmFtZSI6ImRlYW1vbiIsImFwcGlkIjoiM2Y1NmE1ZDUtNzg4Mi00MjkwLTlmZDgtMzkwOGQ3MzRiM2ZlIiwiYXBwaWRhY3IiOiIwIiwiZmFtaWx5X25hbWUiOiLpmYgiLCJnaXZlbl9uYW1lIjoi5biM56ugIiwiaXBhZGRyIjoiMTgwLjE1Mi4yMi41MiIsIm5hbWUiOiLpmYgg5biM56ugIiwib2lkIjoiZjU1MjRmMTAtYTNlYy00Njg3LTllMzktNWFkNmU1ZTY3MDVhIiwicGxhdGYiOiIzIiwicHVpZCI6IjIwMDM3RkZFODExNjMyMDUiLCJzY3AiOiJNYWlsLlNlbmQgVXNlci5SZWFkLkFsbCIsInN1YiI6InhpckVWTFBtVG1BRFpJTW1sZTdBajZwS0NQU2JHMlNGU3EzN3JQaV9rWkUiLCJ0aWQiOiIxMmMwY2RhYi0zYzQwLTRlODYtODBiOS0zZTZmOThkMmQzNDQiLCJ1bmlxdWVfbmFtZSI6ImFyZXNAbW9kdHNwLnBhcnRuZXIub25tc2NoaW5hLmNuIiwidXBuIjoiYXJlc0Btb2R0c3AucGFydG5lci5vbm1zY2hpbmEuY24iLCJ1dGkiOiJRSEswVy0xdXcwbTlxWW9TekNvRUFBIiwidmVyIjoiMS4wIn0.EZhZhKFXzS1hVkz5HNEFSG9lcL6CSRyjqRNEMTYpM0Q4wp7UICf1_61PQFCe_5opnZlEMl-e7sHJ2W4Ni1hqjASUxOamFoQ5pBVNQ-WgEfhX_QPJXLBbyMdFguRPdrXy1AqzYGqFQ_mtmjqFa0w7nXf4LI7vgx7MRPMm5YDljnK4vk4oXC9M7fb4EcU7g26XrBUnTz6Es_IGT9SUqAXYLDjfI3dC06GqtjRrTwtd0AYwbbUPZ288j4XZ_fb8x1lj97ZpIFZh-STnIZUatIij0dFphMrFhUig0YbMtCxlfsrpZgPyuwlrrXbnj5fgWw1ABj3xKrEaWbVt5XCT4T9-aA";GraphServiceClient client = new GraphServiceClient(new DelegateAuthenticationProvider(async (request) =>{await Task.Run(() => { request.Headers.Add("Authorization", $"Bearer {token}"); });}));client.BaseUrl = "https://microsoftgraph.chinacloudapi.cn/v1.0";var result = client.Users.Request().GetAsync().Result;return result;}} }

    總結

    以上是生活随笔為你收集整理的【转】在无人值守程序(服务)中调用Microsoft Graph的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。