我确信有人已经做到了这一点,但我还没有找到任何有关 JWT 的 Microsoft 实现的文档。 Microsoft 的 JWT 库的官方文档基本上是一个空白页面,请参阅:
https://learn.microsoft.com/en-us/dotnet/framework/security/json-web-token-handler-api-reference
所以,这就是我(我相信还有许多其他人)想要实现的目标:
定义:用户 ID = 用于登录系统的用户名或电子邮件地址。
身份验证:
用户登录。用户填写 Web 表单,系统将(通过 HTTPS POST)用户 ID 和密码(经过哈希处理)发送到服务器,以验证/验证用户。
服务器对用户进行身份验证。将根据数据库中保存的值检查用户 ID 和密码,如果无效,则向调用者返回无效的登录响应。
创建 JWT token - ????没有可用的文档!
将 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 中;如果有人想提供更多信息,请提供):
向 Azure 函数发出 POST 请求以执行某些操作(例如获取用户的出生日期)。上面获得的 JWT token 与函数所需的任何其他数据一起加载(从 POST 数据或 header - 这重要吗?)。
JWT token 已验证 - ????没有可用的文档!
如果 JWT token 无效,该函数将返回 BadRequest 响应。
如果 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 设置,单击平台功能选项卡下的“网络 > 身份验证/授权”。启用应用服务身份验证并选择允许匿名请求(无操作),如下所示:
您可以创建一个具有匿名访问功能的 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/