2016-09-19 49 views
2

我对中间件的概念比较陌生。我知道一个中间件在完成时调用下一个中间件。多重身份验证中间件ASP.NET核心

我试图使用Google或我的Identity Server来验证请求。用户可以使用谷歌或本地帐户登录我的移动应用程序。但是,我无法弄清楚如何使用两个身份验证中间件。如果我通过了google的id_token,它会传递第一个中间件(UseJwtBearerAuthentication),但在第二个(UseIdentityServerAuthentication)上失败。我怎样才能使它在传递至少一个身份验证中间件时不会抛出错误?例如,如果它传递给第一个中间件,那么第二个中间件会被忽略?

app.UseJwtBearerAuthentication(new JwtBearerOptions() 
{ 
    Authority = "https://accounts.google.com", 
    Audience = "secret.apps.googleusercontent.com", 
    TokenValidationParameters = new TokenValidationParameters() 
    { 
     ValidateAudience = true, 
     ValidIssuer = "accounts.google.com" 
    }, 
    RequireHttpsMetadata = false 
}); 

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
{ 
    Authority = "http://localhost:1000/", 
    RequireHttpsMetadata = false, 

    ScopeName = "MyApp.Api" 
}); 

回答

4

通常情况下,当一个认证的中间件失败(我的意思不是抛出异常),这并不影响其他成功认证的中间件。你的第二个中间件可能会抛出一个异常(而不是验证失败)。首先检查错误信息并尝试解决它。如果您不能,请使用AuthenticationFailed事件来处理错误。在这种情况下,你的代码应该像下面的东西:

app.UseJwtBearerAuthentication(new JwtBearerOptions() 
{ 
    // ... 
    Events = new JwtBearerEvents() 
    { 
      OnAuthenticationFailed = async (context) => 
      { 
       if (context.Exception is your exception) 
       { 
        context.SkipToNextMiddleware(); 
       } 
      } 
    } 
}); 

然而,为您之情况我不会选择你的方式。我只会使用身份服务器端点。对于与谷歌签约,您可以配置身份服务器象下面这样:

 app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme, 
      AutomaticAuthenticate = false, 
      AutomaticChallenge = false 
     }); 

     app.UseGoogleAuthentication(new GoogleOptions 
     { 
      AuthenticationScheme = "Google", 
      SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme, 
      ClientId = "", 
      ClientSecret = "" 
     }); 

     app.UseIdentityServer(); 

编辑

看来AuthenticationFailed事件不能用于IdentityServer4.AccessTokenValidation。我不确定,但是如果您仅将身份服务器用于jwt令牌,则可以使用UseJwtBearerAuthentication进行验证。

+0

当我回家后,会尝试解决方案2,并在此之后将其标记为答案。谢谢您的回复。 –

相关问题