在具有多个身份验证方案的ASP.NET Core应用程序中遇到JWT令牌问题

时间:2018-01-13 20:46:21

标签: asp.net authentication asp.net-web-api asp.net-core jwt

我有一个包含网页和API的ASP.NET Core 2.0应用程序。我正在为网页使用Cookie身份验证,现在我想将JWT Tokens用于API方法。

我按照这篇文章进行了设置,这对我们完成整个过程非常有用:https://wildermuth.com/2017/08/19/Two-AuthorizationSchemes-in-ASP-NET-Core-2

然而,我在我设置为使用JWT token的API方法中得到了一个奇怪的回应。当我点击API方法时,我在Postman中得到Status 200响应,但我从未达到我在API方法中设置的断点。更有趣的是,Visual Studio调试器显示了一个成功的请求,当我点击它时,我看到一个响应代码302,即使Postman向我显示200 - 见下文: enter image description here

更奇怪的是,我在Postman中看到的回复是我的登录页面的HTML代码,如果用户未经过身份验证,我会将其重定向到。

这是我的身份验证配置。正如您在下面看到的那样,我也使用社交登录,因此我的配置有点长,所以我将所有配置放在一个单独的文件中,以免弄乱我的Startup.cs。我只是用ConfigureServices()方法调用它。

public static void MyAppAuthenticationConfig(IServiceCollection services, IConfiguration configuration)
{
     services.AddAuthentication(options =>
     {
         options.DefaultAuthenticateScheme = "my_cookie";
         options.DefaultChallengeScheme = "my_cookie";
     })
     .AddCookie("my_cookie", options =>
     {
         options.AccessDeniedPath = "/Home/Denied";
         options.LoginPath = "/Login";
     })
     .AddCookie("social_auth_cookie")
     .AddOAuth("LinkedIn", options =>
     {
         options.SignInScheme = "social_auth_cookie";

         options.ClientId = "my_client_id";
         options.ClientSecret = "my_secret";

         options.CallbackPath = "/linkedin-callback";

         options.AuthorizationEndpoint = "https://www.linkedin.com/oauth/v2/authorization";
         options.TokenEndpoint = "https://www.linkedin.com/oauth/v2/accessToken";
         options.UserInformationEndpoint = "https://api.linkedin.com/v1/people/~:(id,first-name,last-name,email-address,picture-url,picture-urls::(original))";

         options.Scope.Add("r_basicprofile");
         options.Scope.Add("r_emailaddress");

         options.Events = new OAuthEvents
         {
             OnCreatingTicket = OnCreatingTicketLinkedInCallBack,
             OnTicketReceived = OnTicketReceivedCallback
         };
      })
      .AddFacebook(options =>
      {
          options.SignInScheme = "social_auth_cookie";
          options.AppId = "my_app_id";
          options.AppSecret = "my_secret";
          options.Events = new OAuthEvents
          {
              OnCreatingTicket = OnCreatingTicketFacebookCallback,
              OnTicketReceived = OnTicketReceivedCallback
          };
      })
      .AddGoogle(options =>
      {
          options.SignInScheme = "social_auth_cookie";
          options.ClientId = "my_id.apps.googleusercontent.com";
          options.ClientSecret = "my_secret";
          options.CallbackPath = "/google-callback";
          options.Events = new OAuthEvents
          {
              OnCreatingTicket = OnCreatingTicketGoogleCallback,
              OnTicketReceived = OnTicketReceivedCallback
          };
       })
       .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, jwtBearerOptions =>
       {
           jwtBearerOptions.RequireHttpsMetadata = false;
           jwtBearerOptions.SaveToken = true;
           jwtBearerOptions.Challenge = JwtBearerDefaults.AuthenticationScheme;
           jwtBearerOptions.TokenValidationParameters = new TokenValidationParameters
           {
               ValidateIssuerSigningKey = true,
               IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("my_secret_key")),
               ValidateIssuer = true,
               ValidIssuer = "myapp-api",
               ValidateAudience = true,
               ValidAudience = "myapp-client",
               ValidateLifetime = true,

               ClockSkew = TimeSpan.FromMinutes(5)
           };
       });
}

这是我想要使用JWT Token的API方法。

[HttpGet("testit")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public IActionResult Test()
{
    return Ok("Hello World!");
}

我有一个断点,我return Ok("Hello World!");,但就像我说我从未打过它。

我在这里做错了什么?

更新: 当我检查ChallangeResult("Bearer")时,这就是我所看到的: enter image description here

以下是我在Postman中发送请求的方式: enter image description here

0 个答案:

没有答案