2017-07-17 108 views
3

我已经创建了一个ASP.Net Web API(.Net Framework)应用程序,其中包含“工作或学校帐户”作为身份验证类型。这会自动在Azure订阅中注册此API应用程序,我可以在"App Registrations"下看到它。我可以看到主页的Url正指向localhost address。我可以看到API在localhost地址上本地启动。然后,我启动Fiddler以从Azure AD获取访问令牌。我的POST请求到端点https://login.microsoftonline.com/<mytenant>.onmicrosoft.com/oauth2/token。有以下4个参数获取授权Azure AD的Fiddler拒绝了此请求

grant_type=client_credentials 
&client_id=<appid from Azure AD Portal> 
&client_secret=<secret from Azure AD Portal> 
&resource=<appid from Azure AD Portal> 

我得到一个令牌回来。当我解码这个令牌时,我预计会看到audappid(匹配Azure AD中的appid)。我使用此令牌作为不记名令牌,通过将GET请求中的Authorization: Bearer <mytoken>头添加到https://localhost:44374/api/values来调用API调用。但是,对我的API的GET调用返回了我的错误消息{"Message":"Authorization has been denied for this request."}

我错过了什么?

回答

2

获取令牌时,应使用App ID URIresource值,你会发现在API的应用程序的PropertiesApp ID URI在蔚蓝的门户,像https://xxxxx.onmicrosoft.com/WebApplicationName。网络API将检查aud要求在访问令牌是否符合您在web.config中设置的一个:在web.config中

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
       new WindowsAzureActiveDirectoryBearerAuthenticationOptions 
       { 
        Tenant = ConfigurationManager.AppSettings["ida:Tenant"], 
        TokenValidationParameters = new TokenValidationParameters { 
         ValidAudience = ConfigurationManager.AppSettings["ida:Audience"] 
        }, 
       }); 

ida:Audience值是允许的观众。

+0

是!就是这样! 'resource'应该匹配'ida:Audience' API配置值。此前,我的API配置值使用URI“https:// xxxxx.onmicrosoft.com/WebApplicationName”,并且我将'clientid'作为我的'资源'传递。只要两个值一致,这两个值都可以工作。即在Web API配置中使用'App ID URI'以及'resource'或使用'client_id'作为Web API配置值和'resource' – Mahesh

+0

如果答案有帮助,请考虑接受为答案,这将有助于其他人问题。 –