2016-09-19 10 views
2

Я относительно новичок в концепции middlewares. Я знаю, что промежуточное программное обеспечение вызывает следующее промежуточное программное обеспечение, когда оно завершается.Множественная аутентификация Middlewares ASP.NET Core

Я пытаюсь выполнить аутентификацию запроса с помощью Google или моего удостоверения личности. Пользователь может войти в мое мобильное приложение с помощью Google или локальной учетной записи. Однако я не могу понять, как использовать оба средства аутентификации. Если я передаю id_token для google, он переходит к первому промежуточному программному обеспечению (UseJwtBearerAuthentication), но не работает во втором (UseIdentityServerAuthentication). Как я могу сделать это так, чтобы он не выдавал ошибку, когда он фактически передает по крайней мере 1 промежуточное ПО для проверки подлинности? Например, если он передает первое промежуточное программное обеспечение, второе промежуточное программное обеспечение игнорируется?

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(); 
       } 
      } 
    } 
}); 

Однако, для scenerio я бы не выбрал свой путь. Я бы использовал только конечную точку сервера идентификации. Для подписания контракта с Google можно настроить сервер идентичности, как показано ниже:

 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, когда я вернусь домой и пометьте это как ответ после этого. Спасибо за ваш ответ. –