我正在尝试保护我的Web API应用程序,以便只有特定用户和应用程序才能使用这些服务。我遵循了许多不同的说明,这些说明表明我有以下代码进行身份验证(我已将其简化为可在控制台应用程序中轻松重现):
class Program
{
private const string ServicesClientId = "11111111-1111-1111-1111-111111111111";
private const string ClientId = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa";
private const string ClientKey = "abcdefghijklmnopqrstuvwxyz1234567890=";
private const string AadLoginUri = "https://login.windows.net/{0}";
private const string TenantId = "example.onmicrosoft.com";
private static readonly string Authority = string.Format(CultureInfo.InvariantCulture, AadLoginUri, TenantId);
static void Main(string[] args)
{
var clientCredential = new ClientCredential(ClientId, ClientKey);
var context = new AuthenticationContext(Authority, false);
// This line fails!
var appAuthResult = context.AcquireToken(ServicesClientId, clientCredential);
// AADSTS50105: Application 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' is not
// assigned to a role for the application '11111111-1111-1111-1111-111111111111'.
var appAuthTokenProvider = new ApplicationTokenProvider(context, "https://example.azurewebsites.net", clientCredential, appAuthResult);
var tokenCreds = new TokenCredentials(appAuthTokenProvider);
Console.WriteLine(tokenCreds.ToString());
Console.ReadLine();
}
}
因此,只要禁用了用户分配但是启用了用户分配的时刻(并等待一分钟,因为即使它表示已成功启用它似乎没有立即生效),此代码也可以很好地工作失败。
我收到以下错误:
AADSTS50105:应用程序'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa'不是 分配给应用程序的角色 '11111111-1111-1111-1111-111111111111'。
我该怎么做才能让它发挥作用?
我已经尝试过各种各样的事情,以便在没有运气的情况下让它消失。我尝试过的事情:
{
"allowedMemberTypes": [
"Application"
],
"displayName": "Universal App Client",
"id": "c27e3fa1-e96a-445c-aaf7-8cbb60cca980",
"isEnabled": true,
"description": "Application Consuming all Services.",
"value": "AppClient"
}
然后设置应用程序权限(在已注册的使用应用程序上)以获得此新的“通用应用程序客户端”权限。knownClientApplications
阵列下添加使用应用程序的客户端ID。我不确定下一步该尝试什么。
供参考,这是我的packages.config文件:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="2.28.1" targetFramework="net46" />
<package id="Microsoft.Rest.ClientRuntime" version="1.8.2" targetFramework="net46" />
<package id="Microsoft.Rest.ClientRuntime.Azure.Authentication" version="0.11.3" targetFramework="net46" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net46" />
</packages>
这个问题与this other question类似,但如上所述,该问题(重新配置和重新部署)的答案对我不起作用。
答案 0 :(得分:2)
我也可以重现这个问题。我发现当我向应用程序角色授予Web API时,该角色可能未按预期授予。这是图供您参考:
作为限制用户和应用程序的解决方法,我们可以在Web API中对其进行编码,以便自己实现令牌处理程序。例如,我们可以配置允许的用户,应用程序,然后解析访问令牌以检索appid
和upn
以验证它。有关自定义令牌处理程序的更多详细信息,您可以参考this thread。
对于原始问题,我也试图在内部报告。