令牌检索期间需要管理员同意的Web应用程序

时间:2019-11-26 17:04:40

标签: c# azure-active-directory microsoft-graph msal

我的目标是绕过登录屏幕,并使用Azure AD作为身份提供程序。

鉴于我已经使用Azure AD用户登录,我想使用静默流来检索授权令牌,并将其用于受保护的资源。

我有一个在ASP.NET MVC 5上运行的Web应用程序,并且由Azure AD(即联合用户)管理和支持。首先,我遵循了本文中的步骤:Integrated Windows Authentication

如果我理解正确,则应该能够使用静默身份验证,因为我的用户是联合用户,并且我的应用程序已注册为公共应用程序。

在Azure AD中,我的应用程序注册了以下属性:

id and access tokens

Public application

Permissions

从url开始,代码很简单。

var app = PublicClientApplicationBuilder.CreateWithApplicationOptions(
        new PublicClientApplicationOptions()
        {
            ClientId = "<clientId>",
            TenantId = "<tenantId>",
            LogLevel = LogLevel.Verbose,
            AzureCloudInstance = AzureCloudInstance.AzurePublic,
        })
    .Build();

var scopes = new [] { "User.Read" };

var result = await app.AcquireTokenByIntegratedWindowsAuth(scopes)
    .WithUsername("<username>")
    .ExecuteAsync();

获取令牌的调用引发以下异常:

  

“ AADSTS65001:用户或管理员不同意使用ID为'xxx'且名为'xxx'的应用程序。为此用户和资源发送交互式授权请求”

根据documentationUser.Read不需要管理员同意。 那我在做什么错了?

编辑: 我已经构建了一个提示用户同意的URL:https://login.microsoftonline.com/tenantId/oauth2/authorize?client_id=clientId&response_type=code&redirect_uri=<myApp>&nonce=1234&resource=User.Read&prompt=consent

它带我到需要选择帐户的屏幕,此后,我被重定向到我的应用程序,在这里我再次遇到相同的异常。

因此,它不会显示任何同意屏幕,只是要求我选择要使用的Microsoft帐户。是否因为管理员已经授予User.Read的同意?

但是为什么我仍然收到错误消息?我现在有点困惑。

3 个答案:

答案 0 :(得分:1)

您正在混合使用两种不同的AAD OAuth机制(即v1和v2端点)。 v1端点使用资源(https://graph.microsoft.com),而v2端点使用范围(user.read)。因此,当您请求resource=User.Read时,将为其传递无效的资源名称。

我建议将v2终结点与以下URI原型一起使用(换行以提高可读性):

https://login.microsoftonline.com/common/oauth2/v2.0/authorize
?client_id={clientId}
&response_type=id_token
&redirect_uri={your_app}
&response_mode=fragment
&scope=user.read

答案 1 :(得分:0)

  

由于集成Windows身份验证是静默流程,因此您的应用程序用户必须事先同意使用该应用程序,或者租户管理员必须事先同意所有用户使用在租户中使用该应用程序。

您可以使用prompt=consent通过网址请求强制user consent,该网址如下所示:

https://login.microsoftonline.com/<tenant-id>/oauth2/authorize?client_id=<client id>&response_type=code&redirect_uri=<Your-Redirect-URI-Https-Encoded>&nonce=1234&resource=<your-resource-Https-encoded>&prompt=consent

如果需要admin consent,请改用$prompt=admin_consent。(需要使用管理员帐户登录)

有关修复错误AADSTS65001的更多详细信息,您可以参考此article

答案 2 :(得分:-2)

具有委派的权限,每个用户将需要同意该应用程序。如果您不希望该要求,则租户管理员可以同意Azure门户中的所有用户。