Microsoft.IdentityModel.Clients.ActiveDirectory.dll中发生未处理的“Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException”类型的异常异常
其他信息:AADSTS50105:已登录的用户’test@azureadwebapitest.onmicrosoft.com’未分配给应用程序’8ed6bbe9-dce7-4bed-83af-aa5472ac4eef’的角色.
我猜测需要在Manifest中调整一些东西,但我不知道.
这是代码:
using Microsoft.IdentityModel.Clients.ActiveDirectory; using System; namespace WebApiClientTest { class Program { static void Main(string[] args) { const string authorityUri = "https://login.microsoftonline.com/azureadwebapitest.onmicrosoft.com/"; const string resource = "https://azureadwebapitest.onmicrosoft.com/test"; const string clientId = "8ed6bbe9-dce7-4bed-83af-aa5472ac4eef"; const string userId = "test@azureadwebapitest.onmicrosoft.com"; const string password = "[REMOVED for StackOverflow post]"; UserCredential credentials = new UserCredential(userId,password); AuthenticationContext context = new AuthenticationContext(authorityUri); var authresult = context.AcquireToken(resource,clientId,credentials); Console.WriteLine("Access token: {0}",authresult.AccessToken); Console.ReadLine(); } } }
完整的重复步骤如下:
1.创建新的Azure AD目录:
2.添加新应用程序:
3.将“访问应用程序所需的用户分配”设置为“是”.设置“读取目录数据”应用程序权限.复制客户端ID.保存:
6.将新浏览器打开到https://account.activedirectory.windowsazure.com/并以用户身份登录.更改密码.请注意没有可用的应用
7.返回Classic Portal.将用户分配给Application中的generalclient角色.请注意,用户现已分配给该应用程序
8.返回用户帐户门户并刷新.您可能需要刷新几次或点击一下.请注意,现在显示该应用程序
>在这一点上,设置应该是完整的.
>创建一个新的控制台应用程序
>安装Nuget包“Microsoft.IdentityModel.Clients.ActiveDirectory”
>将代码复制到控制台应用程序(帖子顶部),将密码插入“password”字符串,然后启动调试:
结果:
Microsoft.IdentityModel.Clients.ActiveDirectory.dll中发生未处理的“Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException”类型的异常异常
其他信息:AADSTS50105:已登录的用户’test@azureadwebapitest.onmicrosoft.com’未分配给应用程序’8ed6bbe9-dce7-4bed-83af-aa5472ac4eef’的角色.
预期结果:
访问令牌被写入控制台输出.
解决方法
角色将由Web API资源而不是测试公布.经过身份验证后,资源访问令牌将在其中具有您的Web API可用于授予访问权限的角色.
假设这不是多租户
首先,您必须配置Web API资源并将其清单修改为
支持角色.这是通过修改清单中的appRoles键来完成的.
然后,您需要更新清单的oauth2Permissions以支持委派的用户访问.在这里(点5)查看此https://azure.microsoft.com/en-us/documentation/articles/active-directory-application-manifest/的信息
现在,Web API已准备就绪,转到其配置选项卡并分配任何用户,可以将其称为UserXYZ以用于特定角色.
接下来,在配置Web API的同一目录中配置Native Client应用程序,并在其配置选项卡 – >中配置.添加应用程序,选择您的Web API资源并选中它以进行委派访问.
回到你的测试应用程序中
var uc = new UserCredential(userName,userPassword); // This is UserXYZ creds var context = new AuthenticationContext(...); //Tenant Id must be correct result = context.AcquireToken("<Your Web API Resource App URI>","<Your Native Client App Id>",uc);