invalid_grant - type = password:用户或管理员未同意使用该应用程序

时间:2016-11-17 01:43:05

标签: c# azure-active-directory adal azure-api-apps

我在尝试获取令牌时收到同意错误。由于我们的申请,我们无法展示互动对话以表示同意。

  

" AADSTS65001:用户或管理员未同意使用   ID为<'我的原生客户端应用ID'>的应用。发送一个   此用户和资源的交互式授权请求。

AuthenticationContext ctx = new AuthenticationContext(
string.Format("https://login.microsoftonline.com/{0}","mytenant.onmicrosoft.com"));
UserPasswordCredential cred = new UserPasswordCredential("login@mytenant.onmicrosoft.com", "Password");
var result = ctx.AcquireTokenAsync("my api uri", "my native client id", cred);

我们使用grant_type=passwordclient_id是原始应用ID,resource是Web API应用URI。

权限 - 来自客户端应用程序,已授予访问api应用程序的委派权限,并且还尝试在清单中设置oauth2AllowImplicitFlow : true

所有应用程序都已在新门户网站(portal.azure.com)的新预览Azure AD部分中创建

1 个答案:

答案 0 :(得分:2)

不幸的是,如果您的应用程序需要访问某些资源(如Graph API),则需要至少提示一次同意。

即使您的应用没有交互式登录体验,您也应该能够提示一次取消阻止租户中的方案。

使用以下网址:

https://login.microsoftonline.com/<TenantID>/oauth2/authorize?client_id=<AppID>&response_type=code&redirect_uri=<RedirectURI>&resource=<ResourceURI>&prompt=admin_consent

您可以在这里看到我们刚刚生成的登录URL,它将作为交互式登录体验的一部分生成。您需要填写自己的特定数据,如回复URL,应用程序ID,资源URI等...

请注意,我们在结尾处添加了一个最终查询字符串,我们强制要求“同意”提示。这应由管理员完成,管理员可以代表整个租户同意。完成后,用户名/密码流应该开始为您工作。

另外,作为补充说明,隐式授权流程与同意无关。 请阅读OAuth 2规范中的此部分: https://tools.ietf.org/html/rfc6749#section-1.3.2

如果您使用JavaScript创建单页应用程序,则只应使用此设置;否则,对于不应该拥有它的应用程序,此设置存在严重的安全问题。