using Microsoft.Owin; using Microsoft.Owin.Security; using Microsoft.Owin.Security.DataHandler.Encoder; using Microsoft.Owin.Security.Jwt; using Owin; using System.Configuration;
public void Configuration(IAppBuilder app) { var issuer = "http://localhost:8080"; var audience = "http://localhost:8081"; var secret = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["jwtSecret"]);
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { audience },
IssuerSecurityKeyProviders = new IIssuerSecurityKeyProvider[]
{
new SymmetricKeyIssuerSecurityKeyProvider(issuer, secret)
}
});
}
[Authorize] [Route("api/users")] public class UsersController : ApiController { // Implementation }
GET /api/users/1 HTTP/1.1 Host: localhost:8080 Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...
其中,JWT令牌的格式如下:
Header.Payload.Signature
Header和Payload部分是使用Base64编码的JSON字符串,而Signature部分是使用HS256算法计算得出的签名。 5. 对于需要在Web API操作中访问JWT声明的情况,可以使用以下代码从当前HTTP请求的OwinContext中检索出声明:
var claimsPrincipal = (ClaimsPrincipal)User; var idClaim = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier); if (idClaim != null) { var userId = idClaim.Value; }