我正在使用 azuread 创建一个 c# Web 应用程序。该应用程序将让 Azure 广告管理员管理租户的用户。为此,我需要登录用户的租户的特定授权。
我的代码适用于大多数范围,如“user.readwrite”和“directory.readwrite.all”。但是当我添加范围'User.ReadWrite.All'时,我收到以下错误:
AADSTS65001:用户或管理员未同意使用 ID 为“客户端应用程序 ID ”的应用程序。为此用户和资源发送交互式授权请求。
有问题的用户是来自https://apps.dev.microsoft.com/的应用程序的所有者 在这个应用程序中,我添加了范围: Mail.Send 、 User.Read 、 User.ReadWrite 、 Directory.ReadWrite.All 和 User .ReadWrite.All。对于最后 2 个范围,需要管理员同意。
但是要强制管理员同意,即使用户是所有者。我使用此 URL 让我的管理员和租户中的所有用户同意具有上述范围的应用程序。
login.microsoftonline.com/common/adminconsent?client_id=客户端应用程序 ID &state=adminconsentstate&redirect_uri=我本地 webapp 的 uri
在 Web 应用程序中,我使用 Microsoft 端点 v2.0 连接 Azuread。
login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=客户端应用程序 ID &response_mode=form_post&response_type=code+id_token&scope=openid+email+profile+offline_access&state=OpenIdConnect.AuthenticationProperties%3d...&prompt=select_account&redirect_uri=重定向网址&post_logout_redirect_uri=注销重定向网址
我使用以下代码获取 Accesstoken。
string userObjectId = "User Object Id Guid";
HttpContextBase baseContext = context.OwinContext.Environment["System.Web.HttpContextBase"] as HttpContextBase;
var tokenCache = new SessionTokenCacheMSAL(userObjectId,baseContext);
ConfidentialClientApplication cca = new ConfidentialClientApplication(_applicationSettings.ClientId,redirectUri.ToString(),new ClientCredential(_applicationSettings.AppKey), tokenCache);
var scopes = new List<string>();
scopes.Add("User.Read");
scopes.Add("user.readbasic.all");
scopes.Add("User.ReadWrite.All");
scopes.Add("Directory.ReadWrite.All");
var runTaskAcquireToken = Task.Run(async () => await cca.AcquireTokenByAuthorizationCodeAsync(scopes.ToArray(), context.Code));
runTaskAcquireToken.Wait();
var result = runtask.Result;
请求 Accesstoken 并使用范围“User.ReadWrite.All”时,我收到上面的错误“AADSTS65001”。当我删除范围“User.ReadWrite.All”时,我可以查看用户、获取 DirectoryRoles 和组织/租户。
奇怪的是,范围“Directory.ReadWrite.All”也需要与 Microsoft 的“User.ReadWrite.All”相同的管理员同意。
资源:
http://graph.microsoft.io/en-us/docs/authorization/permission_scopes
任何解决我的问题的帮助将不胜感激。
谢谢。