当前位置: 首页 > 知识库问答 >
问题:

Azure函数的身份验证

毛弘博
2023-03-14

在过去的24小时里,我已经阅读了所有关于如何创建Azure功能的内容,并成功地将MVC WebApi转换为具有多种功能的新功能应用。我的问题是,我没有找到任何明确的留档或如何使用它们进行最基本的身份验证的教程

我的设想相当直截了当。在我的AAD中配置用户,然后授予这些用户访问特定功能的权限。网站上的用户将单击UI元素,这些元素反过来触发调用my Azure函数的Javascript。在函数中,我需要能够以某种方式验证它们的身份,因为我将把它传递给与SQL实例交互的其他函数。

有人能告诉我一些文档,文章,例子,一些东西,说明我是如何做到这一点的吗?

我在门户网站中找到了我的功能应用程序的“身份验证”配置,并选择AAD作为我的身份验证提供程序。我已将我的函数应用程序添加到其中,并配置了一些用户。然后,我编写了以下测试函数:

[FunctionName("GetThings")]
public static HttpResponseMessage Run([HttpTrigger(AuthorizationLevel.User, "GET", Route = null)]HttpRequestMessage req, TraceWriter log)
{
    log.Info("Getting all the things");
    var identity = ClaimsPrincipal.Current.Identity;

    return identity.IsAuthenticated ?
        req.CreateResponse(HttpStatusCode.Unauthorized, "Not authenticated!") :
        req.CreateResponse(HttpStatusCode.OK, $"Hi {identity.Name}!");
}

目前,当试图直接命中endpoint时,我会被重定向到登录页面...所以我想这部分正在工作。不过,我不清楚如何生成/检索用户令牌,将它们发送到函数的请求中,或者在服务器上处理它们。

帮助

共有3个答案

贺福
2023-03-14

授权级别。azure函数当前不支持用户。请参见此处

截至2017年12月,该计划尚未完全实施。

常元章
2023-03-14

我已经创建了Azure Functions v2的一个小扩展,当与承载令牌一起使用时,它可能会对您有所帮助。

例如,当您希望允许匿名请求应用程序时,可以使用Azure B2C。

因此,无需使用任何样板即可在Azure Function中获取Claims主体。

[FunctionName("Example")]
public async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
    [FunctionToken] FunctionTokenResult token,
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");
    return (ActionResult) new OkObjectResult($"Hello, {token}");
}

代码发布到Github

贺博厚
2023-03-14

用户使用Azure AD进行身份验证后,将向您显示一个AppServiceAuthSessoincookie。这是一个不透明的cookie,但您可以通过调用它来交换可读的id令牌

https://yourFunctionApp.azurewebsites.net/.auth/me

并将不透明cookie作为Cookie标头传入。此外,您返回的id_token很适合用作承载令牌。

事实上,它看起来对我来说是正确的,我还没有真正测试过它作为承载者,所以有点小心。

该机制称为Easy Auth,谷歌搜索该名称更容易。

有关令牌存储的更多信息,请点击此处-
https://cgillum.tech/2016/03/07/app-service-token-store/

...也就是说,您只需读取来自用户浏览器的HTTP头即可获取声明:

访问令牌

在后端代码中,访问这些令牌就像读取HTTP请求标头一样简单。标头的名称类似于X-MS-TOKEN-{提供者}-{type}。下面列出了可能的令牌头名称:

Azure Active Directory令牌请求报头:

X-MS-TOKEN-AAD-ID-TOKEN
X-MS-TOKEN-AAD-ACCESS-TOKEN
X-MS-TOKEN-AAD-EXPIRES-ON
X-MS-TOKEN-AAD-REFRESH-TOKEN

事实上我现在才发现,所以谢谢你的提问!

我的预感是正确的,id_token也可以作为承载:

$ curl -isk https://{funcApp}.azurewebsites.net/api/{someFunc} \
       -H "Authorization: Bearer eyJ0eXAiOi....oEU-Q"

HTTP/1.1 200 OK
Cache-Control: no-cache
Server: Microsoft-IIS/8.0
...

读取声明的两种方式(读取标题与使用用户的Cookie从后端调用/. auth/me)之间的主要区别在于您获得的细节量。后者还有更多。

以下是您从Easy Auth为经过Twitter身份验证的用户获取的标题集:

{
   "cookie": "AppServiceAuthSession=Lx43...xHDTA==",
   ...
   "x-ms-client-principal-name": "evilSnobu",
   "x-ms-client-principal-id": "35....",
   "x-ms-client-principal-idp": "twitter",
   "x-ms-token-twitter-access-token": "35...Dj",
   "x-ms-token-twitter-access-token-secret": "OK3...Jx",
}

你通过调用/. auth/me得到的声明

{
   "access_token": "35...FDj",
   "access_token_secret": "OK3...sJx",
   "provider_name": "twitter",
   "user_claims": [
      {
         "typ": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier",
         "val": "352660979"
      },
      {
         "typ": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn",
         "val": "evilSnobu"
      },
      {
         "typ": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name",
         "val": "Safarihat Hacker"
      },
      {
         "typ": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/webpage",
         "val": "..."
      },
      {
         "typ": "urn:twitter:description",
         "val": "GENIUS. HAVE BRAIN. WILL TRAVEL."
      },
      {
         "typ": "urn:twitter:location",
         "val": ""
      },
      {
         "typ": "urn:twitter:time_zone",
         "val": "London"
      },
      {
         "typ": "urn:twitter:lang",
         "val": "en"
      },
      {
         "typ": "urn:twitter:verified",
         "val": "False"
      },
      {
         "typ": "urn:twitter:profile_image_url_https",
         "val": "https://pbs.twimg.com/profile_images/867473646876545024/1elebfK1_normal.jpg"
      }
   ],
   "user_id": "evilSnobu"
}
 类似资料:
  • 本文向大家介绍C#验证身份证的函数,包括了C#验证身份证的函数的使用技巧和注意事项,需要的朋友参考一下 这段C#代码主要是验证身份证的开头和身份证的格式和长度是否正确,没有按照身份证的编码规则进行严格验证 更为复杂些的验证方法: 方法三: 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 我试图设置一个Python Azure函数,该函数将使用托管标识从密钥库检索机密。我已经给了我的函数应用程序的托管身份权限,以访问和检索密钥库中的秘密。我已经根据下面的Microsoft文档对Python脚本进行了这样的配置: https://docs.microsoft.com/en-us/python/api/overview/azure/key-vault?view=azure-python

  • 如何使用Azure应用服务来验证Web API路由? 我需要向/api/test/auth路由发送什么才能返回200!? 返回401未授权错误?我需要在代码中设置一些东西来处理Twitter授权吗?

  • 我正在Angular中实现Azure Active Directory B2C身份验证。我正在使用msal拦截器连接Azure广告B2C。身份验证请求失败并出现错误 访问“https://login.microsoftonline.com/...”的XMLHttpRequest从来源“http://localhost/..."已被CORS策略阻止:请求的资源上没有“访问-控制-允许-来源”标头。

  • 我正在为我的azure无状态服务fabric应用程序从密钥存储库中获取机密值,并在100s密钥存储库机密中仅有2个密钥存储库机密获得401个依赖项错误(如果我通过connected application insight检查的话)。下面给出的是通过应用程序洞察显示的依赖错误的截图,其中一个密钥存储库的秘密。 这里请求路径是https://mykeyvaultname.vault.azure.net

  • 我正在学习Azure AD和Office 365,我想知道以下内容是否可行,如果可行,如何进行,因为我对文档的几个方面感到困惑: 假设一家名为Companyya的公司为其组织的用户提供Office 365。这些用户使用其Office 365 Cred使用Exchange/Outlook和Office登录(Office desktop)。 Companyya在内部托管了Active Director

  • 身份验证 PDF版下载 企业应用中的URL链接可以通过OAuth2.0验证接口来获取员工的身份信息。 通过此接口获取员工身份会有一定的时间开销。对于频繁获取员工身份的场景,建议采用如下方案: 企业应用中的URL链接直接填写企业自己的页面地址; 员工跳转到企业页面时,企业校验是否有代表员工身份的cookie,此cookie由企业生成; 如果没有获取到cookie,重定向到OAuth验证链接,获取员工

  • 我目前正在使用ASP开发一个网站。net MVC框架,我决定停止使用本地数据库,并在azure上发布我的web应用程序及其关联数据库。现在我有一个奇怪的身份验证问题。身份IsAuthenticated总是正确的。起初,我得到了以下错误: http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier或http://schem