我创建了一个使用 azure Active Directory 保护的 Web api。我现在需要对此进行测试并尝试将 fiddler 与授权标头一起使用。我正在尝试使用以下代码生成令牌。
Target obj = (Target)cmbTarget.SelectedItem;
AuthenticationResult authenticationResult;
string aadInstance = obj.AADInstance; // "https://login.windows.net/{0}";
string tenant = obj.Tenant; //"rudderless.onmicrosoft.com";
string apiResourceId = obj.ApiResourceId; //"15b4ac7f-23a8-4958-96a5-64159254690d";
string clientId = obj.ClientId; // "47cdc6c3-226a-4c38-b08e-055be8409056";
Uri redirectUri = new Uri(obj.RedirectUri); //new Uri("http://nativeclient");
string authority = string.Format(aadInstance, tenant);
authContext = new AuthenticationContext(authority);
authenticationResult = this.authContext.AcquireToken(apiResourceId,
clientId, redirectUri, PromptBehavior.Always);
txtToken.Text = authenticationResult.AccessToken;
Clipboard.SetText($"Bearer {txtToken.Text}");
我成功生成了令牌,当我使用令牌调用 webapi 时,它抛出 401 消息
WWW-Authenticate:承载错误=“invalid_token”,error_description=“
观众无效”
我认为重新审视身份验证的不同步骤很重要,希望通过讨论您能够解决您遇到的问题。
当客户端尝试获取资源的访问令牌时,它需要向 AAD 指定它想要获取哪个资源的令牌。客户端可以配置为调用多个资源,所有资源都具有不同的配置,因此期望资源始终在访问令牌请求中指定。
资源可以是资源的应用程序 ID GUID,也可以是在资源上注册的有效应用程序 ID URI。 AAD 应该能够根据您提供的价值唯一地识别您要尝试访问的资源。但请注意,如果您使用应用程序 ID GUID,您将从 AAD 获得一个令牌,其中受众声明是应用程序 ID GUID。或者,如果您使用应用程序 ID URI,您将看到该 URI 作为令牌中的受众声明。
在这两种情况下,您都将获得“相同”资源的令牌,但令牌中的声明将显示不同。此外,单个应用程序资源可能在其应用程序上注册了多个应用程序 ID URI。根据您在身份验证请求中使用的受众声明,您将在令牌中获得与您传入的资源参数匹配的不同受众声明。
最后,获得令牌后,将其发送到资源 API,资源 API 将验证令牌的多项内容,例如:客户端 ID 声明、范围/角色声明、身份验证方法(“acr”声明) , 和确实观众声称符合他们的期望!
这意味着资源 API 最终需要说“我接受 作为有效的受众声明”...或“我接受 作为有效的受众声明”。这种逻辑可能内置于您正在使用的库(如 OWIN)中,但您需要确保在 API 端,您已针对您期望的受众正确配置了它。如果您愿意,您可以让您的 API 根本不检查受众声明!令牌中的所有声明都是纯文本,因此您确实可以做任何您想做的事情,但在这种情况下您不会有一个非常安全的 API :]
一天结束时,我的预感是这个错误来自您自己的 API,并且发生这种情况是因为您尚未将应用程序配置为接受与您的资源的应用程序 ID GUID 匹配的受众声明(它看起来像您传递的内容)当您根据代码示例获取令牌时)。
我希望这能解决您的问题!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)