C# MS Graph API代表用户-未成功

C# MS Graph API代表用户-未成功,c#,.net,microsoft-graph-api,C#,.net,Microsoft Graph Api,在这一页上,有人说“移动应用程序(Xamarin和UWP)和桌面应用程序使用交互流以用户的名义调用Microsoft Graph。” 所以我开发了一个C#控制台应用程序来登录和查询一些数据: var clientId = "<APP GUID GOES HERE>"; var tenantId = "<APP TENANT GUID GOES HERE>"; var scopes = new[] {"user.r

在这一页上,有人说“移动应用程序(Xamarin和UWP)和桌面应用程序使用交互流以用户的名义调用Microsoft Graph。”

所以我开发了一个C#控制台应用程序来登录和查询一些数据:

var clientId = "<APP GUID GOES HERE>";  
var tenantId = "<APP TENANT GUID GOES HERE>";  

var scopes = new[] {"user.read","Calendars.Read"};
var clientApplication = PublicClientApplicationBuilder  
    .Create(clientId) 
    .Build();  


var authProvider = new InteractiveAuthenticationProvider(clientApplication, scopes);

var graphClient = new GraphServiceClient(authProvider);

User me =  graphClient.Me.Request()
    .GetAsync()
    .Result;
var clientId=“”;
var tenantId=“”;
var scopes=new[]{“user.read”,“Calendars.read”};
var clientApplication=PublicClientApplicationBuilder
.Create(clientId)
.Build();
var authProvider=新的InteractiveAuthenticationProvider(客户端应用程序,作用域);
var graphClient=新的GraphServiceClient(authProvider);
User me=graphClient.me.Request()
.GetAsync()
.结果;
在运行控制台应用程序的过程中,出现了一个登录“页面”,我输入了我的凭据,但最后页面显示错误“AADSTS500113:没有为应用程序注册回复地址”,代码为“用户取消了登录”

顺便说一句:我不想每次都手动登录,我在代码中添加了我的密码:

var scopes = new[] {"offline_access","user.read","Calendars.Read"};
var clientApplication = PublicClientApplicationBuilder  
    .Create(clientId) 
    .Build();  
var authProvider = new UsernamePasswordProvider(clientApplication, scopes);

var graphClient = new GraphServiceClient(authProvider);
var pwd = ConvertToSecureString("<MYPASSWORD GOES HERE>");

User me =  graphClient.Me.Request()
    .WithUsernamePassword("<MY EMAIL GOES HERE>", pwd)
    .GetAsync()
    .Result;
    
var scopes=new[]{“脱机访问”、“用户读取”、“日历读取”};
var clientApplication=PublicClientApplicationBuilder
.Create(clientId)
.Build();
var authProvider=新用户名PasswordProvider(客户端应用程序,作用域);
var graphClient=新的GraphServiceClient(authProvider);
var pwd=转换安全(“”);
User me=graphClient.me.Request()
.WithUsernamePassword(“,pwd)
.GetAsync()
.结果;
在这种情况下,不会显示登录页面(良好),但会出现异常:“在/common或/consumers终结点上不支持授予类型。请使用/organizations或租户特定终结点。”

然后我在
Build()
中添加了
WithTenantId(…)
,现在我得到了不同的异常:“MsalUiRequiredException:AADSTS50076:由于管理员更改了配置,或者因为您移动到了新位置,您必须使用多因素身份验证来访问'00000003-0000-0000-c000-000000000000'但是我的手机没有收到多因素身份验证请求

出了什么问题?我应该怎么做才能让这个应用程序正常工作

我想要的是在我的桌面计算机上定期执行这个c#控制台应用程序,而不需要任何交互(登录),因为我的用户可以使用graph api查询一些数据。如何正确地做到这一点


提前谢谢

此错误
AADSTS500113:没有为应用程序注册回复地址
表示回复URL不可用,AAD不知道将令牌发送到哪里。要解决此问题,您需要在AAD中的应用程序注册中添加有效的重定向URI

下一个错误:在您的情况下,发生这种情况是因为用户需要基于您的Azure AD策略执行多因素身份验证。为此,您需要将您的流从当前用户名/密码提供程序更改为,因为在前一种情况下,需要进行MFA的用户将无法登录(因为没有交互)

这看起来像这样:

IPublicClientApplication publicClientApplication = PublicClientApplicationBuilder
            .Create(clientId)
            .Build();
InteractiveAuthenticationProvider authenticationProvider = new InteractiveAuthenticationProvider(publicClientApplication, scopes);
然后,您可以交互方式获取令牌:

string[] scopes = new string[] {"user.read"};
var app = PublicClientApplicationBuilder.Create(clientId).Build();
var accounts = await app.GetAccountsAsync();
AuthenticationResult result;
try
{
 result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
             .ExecuteAsync();
}
catch(MsalUiRequiredException)
{
 result = await app.AcquireTokenInteractive(scopes)
             .ExecuteAsync();
}
要在没有用户的情况下进行身份验证,您的应用程序可以实现获取方法-这些方法假设应用程序之前已向Azure AD注册了一个秘密(应用程序密码或证书),然后与此调用共享该秘密。请注意,没有用户交互意味着您不能使用委派的权限


让我知道这是否有帮助,以及您是否还有其他问题。

我理解您所说的,但是:仍然不知道本地主机上运行的控制台应用程序的“有效重定向URI”是什么。然后我明白我作为一个用户必须使用双因素身份验证登录,但这是一个权限比我少得多的应用程序。我想在后台运行这个应用程序。所以你说我作为用户必须在每次应用程序尝试登录和查询我的outlook事件时采取行动?Hm.另一个问题-如何构造一个“控制台”应用程序,该应用程序使用令牌或某种方式登录,并从允许对给定应用程序进行此类查询的给定用户处查询某些数据。