Azure OAuth可以解决应用问题

时间:2018-05-03 01:20:58

标签: azure restful-authentication

我有一个非常基本的功能应用程序,它接受GET并返回一些静态文本。最终我希望它将一个POST主体写入队列,但为了保持简单,该函数只返回文本。如果我保持身份验证,我可以加载网址并在我的浏览器或邮递员中获得回复。如果我在功能应用程序中启用aad auth并创建一个简单的应用程序注册,然后在我的浏览器中转到该网站,我会收到提示身份验证,我可以交互式登录;到目前为止没有后顾之忧。

我想使用密钥来访问该功能,以便在没有交互式登录的情况下使用应用程序,因此在app reg中我会转到Keys并生成一个。这是我的问题开始的地方。如果我使用postman并使用我的应用程序ID和密钥配置oauth我可以获得一个令牌,我也通过直接对https://login.microsoftonline.com/ / oauth2 / token进行POST并注意到持有者令牌回复来验证这一点。然而,当我尝试使用持票令牌访问我的功能应用程序时(通过手动添加授权标头或让邮递员从oauth 2.0表单中添加它)我总是被拒绝使用401说明'您没有权限查看此目录或页面。'当我对我的功能应用程序进行GET时。有人能指出我正确的方向吗?提前谢谢。

来自登录网址的示例回复

{
    "token_type": "Bearer",
    "expires_in": "3599",
    "ext_expires_in": "0",
    "expires_on": "1525312644",
    "not_before": "1525308744",
    "resource": "https://<siteaddress>.azurewebsites.net/",
    "access_token": "eyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..etc..."
}

使用令牌

获取针对功能应用的响应
GET /api/t2 HTTP/1.1
> Host: <sitename>.azurewebsites.net
> Authorization: Bearer eyxxxxxxxxxxxxxxxxxxxxxxxxxxxx.....etc....
> Accept: */*
< HTTP/1.1 401 Unauthorized
< Content-Length: 58
< Content-Type: text/html
< WWW-Authenticate: Bearer realm="<sitename>.azurewebsites.net" authorization_uri="https://login.windows.net/<tenantid>/oauth2/authorize" resource_id="<app reg id>"
< X-Powered-By: ASP.NET
< Date: Thu, 03 May 2018 01:12:43 GMT

1 个答案:

答案 0 :(得分:2)

我相信您正在将Azure AD集成与function keys (API key authorization)混合。

后者是一种独立的授权机制,可以附加

?code=<func-key-from-portal>

到功能URL,或传递

x-functions-key: <func-key-from-portal>

标头包含对函数的每个请求。使用功能键时不涉及OAuth。

示例:

GET /api/get-issues HTTP/1.1
Host: {funcapp}.azurewebsites.net
User-Agent: ajax-library-of-the-day
x-functions-key: rkW0PqT.....zcUBQ==

GET /api/get-issues?code=rkW0PqT.....zcUBQ== HTTP/1.1
Host: {funcapp}.azurewebsites.net
User-Agent: ajax-library-of-the-day

Function authorization logic