在 Asp.net Web 服务中集成 JWT

Posted

技术标签:

【中文标题】在 Asp.net Web 服务中集成 JWT【英文标题】:Integrating JWT in Asp.net web service 【发布时间】:2014-04-05 23:50:07 【问题描述】:

谁能告诉我如何将 JWT 集成到默认的 Web API 项目中。

Here is the library

他们只是解释了如何使用 NuGet 安装库以及如何生成令牌。但是现在如何将它与基于身份验证的系统集成?

到目前为止我的实现:

public class WebApiApplication : System.Web.HttpApplication

    protected void Application_Start()
    
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        GlobalConfiguration.Configuration.Filters.Add(new **AuthFilterAttribute()**);
    
   


   public class TokenAuthenticationAttribute : System.Web.Http.Filters.ActionFilterAttribute

    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
    
        // In auth web method you should implement functionality of authentication
        // so that client app could be able to get token
        if (actionContext.Request.RequestUri.AbsolutePath.Contains("api/auth"))
        
            return;
        

        // Receive token from the client. Here is the example when token is in header:
        var token = **actionContext.Request.Headers["Token"];**

        // Put your secret key into the configuration
        var secretKey = "GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk";

        try
        
            string jsonPayload = JWT.JsonWebToken.Decode(token, secretKey);
        
        catch (JWT.SignatureVerificationException)
        
            throw new HttpResponseException(HttpStatusCode.Unauthorized);
        
    

【问题讨论】:

【参考方案1】:

实现 TokenAuthenticationAttribute 并全局注册:

Global.asax 注册

GlobalConfiguration.Configuration.Filters.Add(new TokenAuthenticationAttribute());

TokenAuthenticationAttribute

public class TokenAuthenticationAttribute : System.Web.Http.Filters.ActionFilterAttribute

    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
    
        // In auth web method you should implement functionality of authentication
        // so that client app could be able to get token
        if (actionContext.Request.RequestUri.AbsolutePath.Contains("api/auth"))
        
            return;
        

        // Receive token from the client. Here is the example when token is in header:
        var token = actionContext.Request.Headers["Token"];

        // Put your secret key into the configuration
        var secretKey = "GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk";

        try
        
            string jsonPayload = JWT.JsonWebToken.Decode(token, secretKey);
        
        catch (JWT.SignatureVerificationException)
        
            throw new HttpResponseException(HttpStatusCode.Unauthorized);
            
    

【讨论】:

您能否也添加一个代码块,其中包含如何使用令牌的示例?即我如何使用它?我只是在控制器上方放一个[Authorize] 吗? @Zapnologica 就您在全球范围内注册它而言,您的 attr 将为每个请求执行。无需将 attr 放在每个控制器之上。您只需要允许匿名访问 Authenticate 等方法。 好的,很好。这听起来很理想。我会试一试,然后回复你。在您的示例中,我显然仍然必须使用 nuget 安装它。然后在 global.asax 文件中配置它。我在哪里放置 TokenAuthenticationAttribute: 代码? @Zapnologica 任何你喜欢的地方。在您的项目中创建文件夹“属性”;) @Zapnologica 有什么错误?编译时间/运行时间?

以上是关于在 Asp.net Web 服务中集成 JWT的主要内容,如果未能解决你的问题,请参考以下文章

在我现有的 ASP.NET WebForm 项目中集成 YAF.NET

在 ASP.NET 中集成支付网关

如何在 ASP.NET MVC 中集成 AngularJS

如何在 asp.net 中集成 Paypal Api 以进行快速结帐?

如何在 ASP.NET MVC 中集成 AngularJS

在 Asp.Net 解决方案中集成 silverlight 控件的最佳实践