Я разрабатываю 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?