C# 当我有访问令牌代码时,授权请求被拒绝

C# 当我有访问令牌代码时,授权请求被拒绝,c#,webforms,azure-active-directory,C#,Webforms,Azure Active Directory,当我调用返回访问令牌的授权请求拒绝请求的graph API时,Blockquoteafter访问令牌 using (var webClient = new WebClient()) { var requestParameters = new NameValueCollection(); requestParameters.Add("resource", resource); requestParameters.Add("client_id", clientID); r

当我调用返回访问令牌的授权请求拒绝请求的graph API时,Blockquoteafter访问令牌

using (var webClient = new WebClient()) 
{
   var requestParameters = new NameValueCollection();
   requestParameters.Add("resource", resource);
   requestParameters.Add("client_id", clientID); 
   requestParameters.Add("grant_type", "client_credentials");
   requestParameters.Add("client_secret", secret);
   var url = $"https://login.microsoftonline.com/{tenant}/oauth2/token";
   var  responsebytes = await webClient.UploadValuesTaskAsync(url,"POST",requestParameters);
   var responsebody =Encoding.UTF8.GetString(responsebytes);
   var obj = JsonConvert.DeserializeObject<JObject>(responsebody);
   var token = obj["access_token"].Value<string>();
   access_token = token;  
}
使用(var webClient=new webClient())
{
var requestParameters=new NameValueCollection();
requestParameters.Add(“资源”,resource);
添加(“客户端id”,clientID);
添加(“授权类型”、“客户端凭据”);
requestParameters.Add(“client_secret”,secret);
var url=$”https://login.microsoftonline.com/{tenant}/oauth2/token”;
var responsebytes=wait webClient.UploadValuesTaskAsync(url,“POST”,requestParameters);
var responseByte=Encoding.UTF8.GetString(responsebytes);
var obj=JsonConvert.DeserializeObject(responsebody);
var token=obj[“访问令牌”].Value();
访问令牌=令牌;
}
当我请求表单时,通过这种方式从Azure AD获取用户列表

 public async Task<List<listItems>> GetData1( string token)
 {
     HttpClient http = new HttpClient(); 
     string query = "https://graph.microsoft.com/v1.0/users";
     HttpRequestMessage httpClient = new HttpRequestMessage(HttpMethod.Get, query);
     httpClient.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
     var res = await http.SendAsync(httpClient);
     var res1= await res.Content.ReadAsStringAsync();
     List<listItems> lstUsers = new List<listItems>();
     JObject results = JObject.Parse(res1); listItems itm;
      foreach (var Jelem in results["value"])
      { 
          string id = (string)Jelem["id"];
          string displayName = (string)Jelem["displayName"];
          itm = new listItems(); itm.id = id;
          itm.displayname = displayName; lstUsers.Add(itm);
      }
      return lstUsers;
 }
公共异步任务GetData1(字符串令牌) { HttpClient http=新的HttpClient(); 字符串查询=”https://graph.microsoft.com/v1.0/users"; HttpRequestMessage httpClient=新的HttpRequestMessage(HttpMethod.Get,query); httpClient.Headers.Authorization=新的AuthenticationHeaderValue(“承载者”,令牌); var res=await http.sendaync(httpClient); var res1=await res.Content.ReadAsStringAsync(); List lstUsers=新列表(); JObject results=JObject.Parse(res1);listItems itm; foreach(结果中的var Jelem[“值”]) { 字符串id=(字符串)Jelem[“id”]; 字符串displayName=(字符串)Jelem[“displayName”]; itm=newlistItems();itm.id=id; itm.displayname=displayname;lstUsers.Add(itm); } 返回用户; } 然后我得到了“error”:
{“code”:“Authorization_RequestDenied”,“message”:“特权不足,无法完成操作”,“inneerror”:{“request id”:“1ba8a3e3-7e27-4bad-affd-6929b9af3a9f”,“date”:“2019-03-26T10:56:26”}
上述错误

请帮助我解决此错误

原因

出现此问题的原因是应用程序没有访问用户信息所需的权限。因此,您需要为此请求分配必要的特权

解决方案

要访问API,需要以下权限之一

(从最低特权到最高特权)

委托(工作或学校帐户)用户。读取,用户。读写, User.ReadBasic.All

User.Read.All,User.ReadWrite.All,Directory.Read.All, Directory.ReadWrite.All

Directory.AccessAsUser.All

委派(个人Microsoft帐户)用户。读取,用户。读写

应用程序User.Read.All、User.ReadWrite.All、Directory.Read.All、

Directory.ReadWrite.All

请参见下面的屏幕截图:

AZURE门户的出路

要在azure portal上分配权限,请参见下面的屏幕截图:

ASP.NET WEB表单示例:

1.将新的Aspx页面添加到项目中

以一个新的web表单为例,这里我将其作为Token.aspx,并将其属性设置为如下所示

 <%@ Page Language="C#" AutoEventWireup="true" Async="true"
 CodeBehind="Token.aspx.cs" Inherits="WebFormTest.Token" %>
RegisterAsyncTask(new PageAsyncTask(GetTokenByROPCFormat));
5.令牌输出

如果将调试器设置为结果变量,您将获得如下所示的令牌

6.访问Microsoft Graph API

现在转到下一行,如下所示设置调试器

 <%@ Page Language="C#" AutoEventWireup="true" Async="true"
 CodeBehind="Token.aspx.cs" Inherits="WebFormTest.Token" %>
RegisterAsyncTask(new PageAsyncTask(GetTokenByROPCFormat));
字符串输出=wait response.Content.ReadAsStringAsync()

您将看到以下输出


希望它能解决您的问题。谢谢。

天哪,我都不知道发生了什么。现在您可以阅读亲爱的@BugFinderOk,调试时间到了。您确定在第一段代码中得到了正确的响应吗?ResponseBy是一个令牌吗?这里有很多变量没有定义。看,您确定您所使用的用户是谁吗登录时在graph网站上拥有足够的权限添加Microsoft登录到ASP.NET web表单我将如何使用@BugFinder亲爱的@BugFinder,您是否有如何从ASP.NET web表单(而不是ASP.NET MVC)获取访问令牌以调用Microsoft graph的示例。@CharitPandey我已使用aspx web表单示例更新了我的答案请尝试。而不是谢谢,@Md Farid Uddin Kiron,这对我很有帮助。@CharitPandey很高兴知道,很高兴编码!我也很高兴认识你。