Как пройти аутентификацию в C # Web API с помощью Google Authentication? - PullRequest
0 голосов
/ 04 июля 2019

Я разрабатываю C # Web Api (.NET Framework) и хотел бы параллельно использовать аутентификацию AAD (уже работает правильно) и аутентификацию Google. Это означает, что мои клиенты (javascript или просто Postman) должны получить токен, включить его в заголовок авторизации (токен Bearer) и иметь возможность выполнять методы API.

Однако, похоже, что токен, который я генерирую с помощью Postman, не принят моим C # Web Api. Я всегда получаю HTTP 401. AAD (Windows Azure Active Directory) работает без проблем.

Использование C # Web Api (.Net Framework 4.6.1), включая пакет Microsoft.Owin.Security.Google Nuget v.4.0.1.

Я создал клиент Oauth на консоли разработчика Google, получил свой идентификатор клиента и секрет клиента. Также я настроил там URI перенаправления.

Я использую авторизацию Postman Oauth2, настраиваю следующие параметры:

  • Тип гранта: неявный
  • URL обратного вызова: мой URL
  • AUth URL: https://accounts.google.com/o/oauth2/v2/auth
  • Идентификатор клиента: 65xxxxxmyclientid.apps.googleusercontent.com
  • область действия: профиль электронной почты openid

Затем я могу войти в свою учетную запись Google, дать согласие на использование областей действия и получить токен, подобный следующему:

токен доступа ya29.Gls7 ....

Этот токен затем отправляется в качестве заголовка авторизации, например "Bearer ya29.Gls7 ...." *

Startup.Auth

 public void ConfigureAuth(IAppBuilder app)
        {
            app.UseWindowsAzureActiveDirectoryBearerAuthentication(
                 new WindowsAzureActiveDirectoryBearerAuthenticationOptions
                 {
                     Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
                     TokenValidationParameters = new TokenValidationParameters
                     {
                         ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
                     },
                 });

            app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
            {
                ClientId = ConfigurationManager.AppSettings["GoogleClientId"],
                ClientSecret = ConfigurationManager.AppSettings["GoogleClientSecret"],
            });
        }

ValuesController

public class ValuesController : ApiController
{
  [Authorize]
        // GET api/values/5
        public string Get(int id)
        {
            return "value";
        }
}

Каждый раз, когда я вызываю API с помощью Postman, я получаю 401, хотя токен на предъявителя включен в заголовок авторизации запроса.

HTTP GET https://localhost:44385/api/values/1

Редактировать: С моей стороны нет специального кода, который бы проверял токен. Я предположил, что это делается автоматически библиотекой. Фактически, это делается автоматически для токенов AAD, но не в случае Google Oauth.

Я ожидаю попасть внутрь кода метода контроллера, указав хотя бы имя пользователя с именем / адресом электронной почты учетной записи Google.

Чего мне не хватает, чтобы пройти проверку подлинности в методе моего контроллера с учетной записью Google?

...