当前位置: 首页 > 知识库问答 >
问题:

ASP。NET 4.5 Web API 2.0,JWT消息处理程序将状态0返回给7个HTTP拦截器

厉坚
2023-03-14

提前谢谢。实际上,我希望在Angular 7应用程序中使用HTTP拦截器实现JWT刷新令牌。我已经使用HTTP消息处理程序(DelegatingHandler)实现了JWT。在未经授权的请求中,我收到的是HttpErrorResponse Status=0,而不是401以刷新令牌。

浏览器窗口: 2:50191/api/test/testget: 1 GEThttp://localhost:50191/api/test/testget401(未授权): 4200/#/登录: 1访问XMLHttpRequest at'http://localhost:50191/api/test/testget'从源'http://localhost:4200'已被CORS策略阻止:否'访问-控制-允许-Origin'标头存在于请求的资源上。

...NET 4.5 Web API 2.0:CORS添加。

Angular: HTTP Interceptor截获(req: HttpRequest,下一个: HttpHandler):可观察

    return next.handle(this.attachTokenToRequest(req)).pipe(
        tap((event: HttpEvent<any>) => {
            if (event instanceof HttpResponse) {
                console.log("Success");
            }
        }), catchError((err): Observable<any> => {
            if (err instanceof HttpErrorResponse) {
                switch ((<HttpErrorResponse>err).status) {
                    case 401:
                        console.log("Token Expire,,, attempting 
refresh");
                        return this.handleHttpResponseError(req, next);
                    case 400:
                        return <any>this.authService.logout();
                }
            } else {
                return throwError(this.handleError);
            }
        })
    )
}

API:

WebApiConfig:

public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        var cors = new EnableCorsAttribute("*", "*", "*", "*");
        config.EnableCors(cors);
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.MessageHandlers.Add(new TokenValidationHandler());

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }

TokenValidationHandler:

protected override async Task<HttpResponseMessage> 
SendAsync(HttpRequestMessage request, CancellationToken 
cancellationToken)
    {
        HttpStatusCode statusCode;
        string token;
        //determine whether a jwt exists or not
        if (!TryRetrieveToken(request, out token))
        {
            statusCode = HttpStatusCode.Unauthorized;
            //allow requests with no token - whether a action method 
needs an authentication can be set with the claimsauthorization attribute
            var response = await base.SendAsync(request, 
cancellationToken);
            //response.Headers.Add("Access-Control-Allow-Origin", "*");
            return response;
        }

        try
        {
            const string sec = "5a65ed1";
            var now = DateTime.UtcNow;
            var securityKey = new 
SymmetricSecurityKey(System.Text.Encoding.Default.GetBytes(sec));


            SecurityToken securityToken;
            JwtSecurityTokenHandler handler = new 
JwtSecurityTokenHandler();
            TokenValidationParameters validationParameters = new 
 TokenValidationParameters()
            {
                ValidAudience = "http://localhost:50191",
                ValidIssuer = "http://localhost:50191",
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                LifetimeValidator = this.LifetimeValidator,
                IssuerSigningKey = securityKey
            };
            //extract and assign the user of the jwt
            Thread.CurrentPrincipal = handler.ValidateToken(token, 
validationParameters, out securityToken);
            HttpContext.Current.User = handler.ValidateToken(token, 
 validationParameters, out securityToken);

            return await base.SendAsync(request, cancellationToken);
        }
        catch (SecurityTokenValidationException e)
        {
            statusCode = HttpStatusCode.Unauthorized;
        }
        catch (Exception)
        {
            statusCode = HttpStatusCode.InternalServerError;
        }
        return await Task<HttpResponseMessage>.Factory.StartNew(() => new 
  HttpResponseMessage(statusCode) { });
    }

我希望http状态代码401刷新jwt令牌。

共有1个答案

狄雅珺
2023-03-14

您可以使用小型帮助程序库在本地验证令牌过期,然后重新验证或获取已过期的刷新令牌。这可能是一个更干净的解决方案。

我在我的身份验证服务中成功地使用了angular2-jwt的JwtHelper。

import { JwtHelper } from 'angular2-jwt';
import { Injectable } from '@angular/core';
import { CanActivate, Router } from '@angular/router';

@Injectable()
export class AuthGuard implements CanActivate {
  constructor(private jwtHelper: JwtHelper, private router: Router) {
  }
  canActivate() {
    var token = localStorage.getItem("jwt");

    if (token && !this.jwtHelper.isTokenExpired(token)){
      console.log(this.jwtHelper.decodeToken(token));
      return true;
    }
    this.router.navigate(["login"]);
    return false;
  }
}
 类似资料:
  • 像“addSomething()”这样的类也有方法。这个可以成功也可以不成功。因此,成功的状态可以用一个布尔返回值来显示。但是有时方法调用会因为几个原因而失败。“false”显示了这一点,但只是以一般方式显示。有时程序员想知道失败的原因。为此,提供一个自己的报告类来提供这样的功能有用吗? 然后,您可以决定是否要使用“wassucsuccess()”获取一般成功报告,或者是否还要使用“getMess

  • 拦截消息框 bp MessageBox(A) 创建消息框 bp MessageBoxExA 创建消息框 bp MessageBoxIndirect(A) 创建定制消息框

  • 问题内容: 我在这我想从服务器获取与$ HTTP GET XML数据的AngularJS应用说http://example.com/a/b/c/d/getDetails?fname=abc&lname=def(此通过在浏览器中输入链接进行手动访问时显示XML文件的树状结构)。 当我运行应用程序时,不会从该链接获取数据。而是显示 状态为0 的错误。 我不确定$ http.get为什么会失败并转到返回

  • 我们正在将AngularJS应用程序迁移到最新的Angular版本。我们总是通过接收状态代码200来处理http请求,如果有错误,我们仍然得到状态代码200(不包括404-500,以及关于实际服务器或用户连接的错误)。例如,如果用户令牌过期,我们发出请求,我们将得到一个状态代码200,其主体为errorcode:number,message:string。这是不会改变的。 使用关于令牌的相同示例,

  • 我最近几天在玩Spring拦截器,想通过拦截器捕捉和处理特定的请求。我要做的是在每个请求被特定的控制器处理之前拦截它,检查请求是否包含特定的参数。如果是,做一些事情,然后将这些事情签名到映射请求的控制器。 最后,我设法做到了这一点,但当我使用不同的参数值一次执行多个请求时,只有来自上一个请求的参数值被分配给每个控制器处理程序,甚至每个控制器都应该有包含在请求中的参数。 示例(同时执行): http

  • 我正在使用netty构建一个应用程序。在应用程序中,我需要处理传入和传出的消息。要求是应用程序将发送的任何消息都应由特定的处理程序处理,进入应用程序的任何消息都应由另一个特定的处理程序处理。但是,我希望在两个处理程序之间交换消息,以便能够跟踪发送的消息响应,因为请求消息也将发送到应用程序。 请任何想法hwo实施这样的要求。这个问题听起来可能不相关,但这就是我得到的,我还不是一个网络极客。我读到的关