一旦生成
WebAPI
访问令牌,WebAPI
如何为下一个请求验证该令牌?我想知道我是否可以使用 [Authorize]
属性,如果存储在某处,它必须将客户端发送的令牌与服务器端的令牌进行比较。它只是检查令牌是否存在而不是它的值吗?
不记名令牌
首先,您颁发授权令牌的身份提供者或令牌提供者需要具有与用于加密/解密的Web Api应用程序相同的机器密钥设置:
因为在后台 Bearertoken 使用 MachineKey 加密。 换句话说,如果您没有相同的设置,您的网络 API 将无法解密令牌(验证它)。 这是自动完成的:
Microsoft.Owin.Security.OAuth.dll
使用中间件。
如果你想使用用户名或这样的角色进行简单授权,你可以在你的 web api 控制器/操作上使用 Authorize Attribute:
[Authorize(Roles="Administrators,Managers",Users ="Mike,Laura")]
如果你想要自定义授权,那么你必须实现一个自定义授权属性,它将在你的 web api 中处理自定义授权。如果不允许用户通过,您将返回 401 UnAuthorized Response:
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
actionContext.Response.Headers.Add("WWW-Authenticate","Bearer location='http://localhost:8323/account/login'");
例如:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class CustomAuthorizeAttribute : System.Web.Http.Filters.AuthorizationFilterAttribute
{
public RulesExampleEnum[] Rules { get; set; }
public string Id { get; set; }
.....
// Summary:
// Calls when a process requests authorization.
//
// Parameters:
// actionContext:
// The action context, which encapsulates information for using System.Web.Http.Filters.AuthorizationFilterAttribute.
public virtual void OnAuthorization(HttpActionContext actionContext);
public virtual Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken);
并将其注册到您的 webApiConfig.cs
config.Filters.Add(new CustomAuthorizeAttribute());
并将其应用于 Web Api 控制器或操作:
[CustomAuthorize(Id = "AnyId", Rules = new RulesExampleEnum[] { RulesExampleEnum.Rule1, RulesExampleEnum.Rule3 })]
public IEnumerable<object> Get()
{...
一旦生成访问令牌,客户端必须在每个请求的标头中包含访问令牌。
Client 可以在
Authorization
HTTP 标头中设置访问令牌。
在服务器端,您应该创建类来处理授权,它是
System.Web.Http.AuthorizeAttribute
的派生类,如下所示:
public class AuthorizationHandlerAttribute : AuthorizeAttribute
{
string AccessTokenFromRequest = "";
if (actionContext.Request.Headers.Authorization != null)
{
// get the access token
AccessTokenFromRequest = actionContext.Request.Headers.Authorization.Parameter;
}
string AccessTokenStored = "";
// write some code to get stored access token, probably from database
// then assign the value to a variable for later use
// compare access token
if (AccessTokenFromRequest != AccessTokenStored)
{
// if the token is not valid then return 401 Http Stasus
// or simply call base method
base.HandleUnauthorizedRequest(actionContext);
}
}
然后您使用新创建的类并将其附加到您希望防止未经授权访问的
controller
或action
上。
public class UsersController : ApiController
{
[AuthorizationHandler]
public User Get(int id)
{
// only request with valid access token will reach this
}
}
密钥在从客户端到服务器的请求的header中传输,并且在使用[Authorize]属性的每个请求中在服务器验证内容。
您可以使用 Telerik 的 Fiddler(免费)等工具来查看正在传输的数据,但看不到内容(因为它已加密)。在使用 MVC / WebAPI 时,检查原始 Web 流量非常重要,因此我强烈推荐它。这是 Fiddler 的链接,尽管也存在其他类似的工具。
http://www.telerik.com/fiddler
要回答问题的第二部分,服务器在允许请求按授权进行之前绝对检查密钥的内容。
ChatGPT 说-
服务器收到JWT token后,首先要验证签名,确保token没有被篡改。以下是服务器验证 JWT 令牌的一般步骤:
解码令牌:第一步是解码 JWT 令牌。令牌由三部分组成,由点分隔。第一部分是标头,其中包含有关用于对令牌进行签名的算法的信息。第二部分是有效载荷,其中包含正在传输的声明(或数据)。第三部分是签名,用于验证token的真伪。
验证签名:服务器必须使用标头中指定的算法,使用标头和有效负载以及用于签署令牌的密钥重新创建签名。如果新创建的签名与令牌中的签名相匹配,那么服务器就可以确信令牌没有被篡改并且是由可信方签名的。
Verify the claims:签名通过验证后,服务器应验证负载中包含的声明,以确保它们有效并符合预期值。例如,服务器可能会检查令牌中的用户 ID 是否与自己数据库中的用户 ID 匹配。
检查令牌过期时间:最后,服务器要检查令牌的过期时间,确保没有过期。如果令牌已过期,服务器应拒绝令牌。
如果以上所有检查都通过,则服务器可以相信令牌是真实的并且包含有关用户的有效信息。然后,服务器可以使用令牌中的声明来识别和授权用户访问所请求的资源或服务。