azure - 将 JSON Web token (JWT) 与 Azure Functions 结合使用(不使用 Active Directory)

标签 azure jwt azure-functions

我确信有人已经做到了这一点,但我还没有找到任何有关 JWT 的 Microsoft 实现的文档。 Microsoft 的 JWT 库的官方文档基本上是一个空白页面,请参阅:

https://learn.microsoft.com/en-us/dotnet/framework/security/json-web-token-handler-api-reference

所以,这就是我(我相信还有许多其他人)想要实现的目标:

定义:用户 ID = 用于登录系统的用户名或电子邮件地址。

身份验证:

  1. 用户登录。用户填写 Web 表单,系统将(通过 HTTPS POST)用户 ID 和密码(经过哈希处理)发送到服务器,以验证/验证用户。

  2. 服务器对用户进行身份验证。将根据数据库中保存的值检查用户 ID 和密码,如果无效,则向调用者返回无效的登录响应。

  3. 创建 JWT token - ????没有可用的文档!

  4. 将 JWT token 返回给调用者 - ???? - 我假设在标题中?通过 JSON,不确定 - 再次 - 没有文档。

根据下面的代码,任何人都可以提供第 3 步和第 4 步的代码示例吗?

  [FunctionName( "authenticate" )]
  public static async Task<HttpResponseMessage> Run( [HttpTrigger( AuthorizationLevel.Anonymous, "get", "post", Route = null )]HttpRequestMessage req, TraceWriter log )
  {

   // Step 1 - Get user ID and password from POST data

   /*
   * Step 2 - Verify user ID and password (compare against DB values)
   * If user ID or password is not valid, return Invalid User response
   */

   // Step 3 - Create JWT token - ????

   // Step 4 - Return JWT token - ????

  }

授权:

假设用户已通过身份验证并且现在拥有 JWT token (我假设 JWT token 保存在用户 session 中;如果有人想提供更多信息,请提供):

  1. 向 Azure 函数发出 POST 请求以执行某些操作(例如获取用户的出生日期)。上面获得的 JWT token 与函数所需的任何其他数据一起加载(从 POST 数据或 header - 这重要吗?)。

  2. JWT token 已验证 - ????没有可用的文档!

  3. 如果 JWT token 无效,该函数将返回 BadRequest 响应。

  4. 如果 JWT token 有效,该函数将使用传递给它的数据来处理并发出响应。

根据下面的代码,任何人都可以提供第 1 步和第 2 步的代码示例吗?

  [FunctionName( "do_something" )]
  public static async Task<HttpResponseMessage> Run( [HttpTrigger( AuthorizationLevel.Anonymous, "get", "post", Route = null )]HttpRequestMessage req, TraceWriter log )
  {

   // Step 1 - Get JWT token (from POST data or headers?)

   // Step 2 - Validate the JWT token - ???

   // Step 3 - If JWT token is not valid, return BadRequest response

   // Step 4 - Process the request and return data as JSON

  }

任何和所有信息都将真正帮助我们(我)了解如何将 JWT 与 Azure(匿名)函数结合使用,以构建“安全”的 REST API。

提前致谢。

最佳答案

Any and all information would really help those of us (me) understand how to use JWT with Azure (anonymous) functions in order to build a "secure" REST API.

根据我的理解,您可以在 Azure 函数代码中使用相关库来生成/验证 JWT token 。这里有一些教程,你可以引用一下:

Create and Consume JWT Tokens in C#

Jwt.Net, a JWT (JSON Web Token) implementation for .NET

JWT Authentication for Asp.Net Web Api

此外,您可以利用 App Service Authentication / Authorization配置功能应用程序级别的身份验证/授权。您可以转到 Function App 设置,单击平台功能选项卡下的“网络 > 身份验证/授权”。启用应用服务身份验证并选择允许匿名请求(无操作),如下所示:

enter image description here

您可以创建一个具有匿名访问功能的 HttpTrigger 函数来进行用户日志记录,并在用户存在时返回 JWT token 。对于 protected REST API,您可以按照以下代码示例进行操作:

if(System.Security.Claims.ClaimsPrincipal.Current.Identity.IsAuthenticated)
{
   //TODO: retrieve the username claim
   return req.CreateResponse(HttpStatusCode.OK,(System.Security.Claims.ClaimsPrincipal.Current.Identity as ClaimsIdentity).Claims.Select(c => new { key = c.Type, value = c.Value }),"application/json");
}
else
{
    return req.CreateResponse(HttpStatusCode.Unauthorized,"Access Denied!"); 
}

要生成应用服务身份验证中使用的 JWT token ,您可以按照 How to: Use custom authentication for your application 进行操作。以及 Adrian Hall 关于 Custom Authentication 的书中自定义 API Controller CustomAuthController 下的代码创建 JWT token 。

更新:

对于应用服务身份验证下的自定义身份验证方法,我只想利用 EasyAuth 提供的身份验证/授权。我对这种方法做了一些测试,发现它对我有用。 Op可以将用户名和密码发送到HttpTrigger进行身份验证,然后HttpTrigger后端需要验证用户信息,并使用Microsoft.Azure.Mobile.Server.Login用于向客户端颁发应用服务身份验证 token 的包,然后客户端可以从 AuthenticationToken 属性检索 token 。针对 protected API 的后续请求可能如下所示:

https://<your-funapp-name>.azurewebsites.net/api/<httpTrigger-functionName>
Header: x-zumo-auth:<AuthenticationToken>

注意:

对于这种方法,相关的 HttpTrigger 函数需要允许匿名访问,并且应用服务身份验证也需要选择允许匿名请求(无操作)。否则,应用服务身份验证和功能级别身份验证都将验证请求。对于 protected API,op 需要手动添加 System.Security.Claims.ClaimsPrincipal.Current.Identity.IsAuthenticated 检查。

关于azure - 将 JSON Web token (JWT) 与 Azure Functions 结合使用(不使用 Active Directory),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49162583/

相关文章:

azure - Azure B2C 上的访问问题

python - 在本地(非 Azure)docker 实例中使用来自 Azure feed 的 python 包

javascript - 如何使用 Node.js 为所有连接最好地实现 HTTPS?

c# - IHostedService 可在 Azure Functions 应用程序中使用吗?

html - 如何将生成的 SAS token 从 NodeJS Azure Function 传递到 HTML?

Azure 数据工厂从元数据复制事件新的上次修改列

java - 如何在 REST 上使用基于 token 的授权?

python - 在flask-login中使用request_loader的正确方法是什么

Azure数据工厂: How to rename blob csv or text file in blob storage during copy or import?

asp.net - 如何在Windows Azure云服务中读取Excel文件中的数据?