2016-02-03 2 views
3

Я слежу за учебником по webapi oauth login здесь;WebApi 2 OAuth External Login Access Token Issue

http://bitoftech.net/2014/08/11/asp-net-web-api-2-external-logins-social-logins-facebook-google-angularjs-app/

Это все проходит гладко, но я с трудом с извлекая маркер, посланный от внешнего поставщика (в данном тестовом случае Google).

Таким образом, после того, как пользователь аутентифицирует и подтверждает логин, конечная точка «ExternalLogin» во второй раз на webapi с данными аутентификации.

в этом методе вызывается следующий, чтобы извлечь все данные к классу

ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity); 

Его здесь, что это, кажется, падения. Как при вызове метода FromIdentity;

public static ExternalLoginData FromIdentity(ClaimsIdentity identity) 
    { 
     if (identity == null) 
     { 
      return null; 
     } 

     Claim providerKeyClaim = identity.FindFirst(ClaimTypes.NameIdentifier); 

     if (providerKeyClaim == null || String.IsNullOrEmpty(providerKeyClaim.Issuer) || String.IsNullOrEmpty(providerKeyClaim.Value)) 
     { 
      return null; 
     } 

     if (providerKeyClaim.Issuer == ClaimsIdentity.DefaultIssuer) 
     { 
      return null; 
     } 

     return new ExternalLoginData 
     { 
      LoginProvider = providerKeyClaim.Issuer, 
      ProviderKey = providerKeyClaim.Value, 
      UserName = identity.FindFirstValue(ClaimTypes.Name), 
      ExternalAccessToken = identity.FindFirstValue("ExternalAccessToken"), 
     }; 
    } 

линия;

ExternalAccessToken = identity.FindFirstValue("ExternalAccessToken") 

возвращается как null? Я не вижу, чтобы этот знак был возвращен в любой из претензий?

+0

Таким образом, в классе «GoogleAuthProvider», который реализует «IGoogleOAuth2AuthenticationProvider», и если вы послали брейк-поинт на аутентичном случае, вы были в состоянии проверить значение «context.AccessToken»? Если не какая версия MS.Owin.Security вы используете? Можете ли вы попытаться отступить и использовать те же версии, что и в этом посте, если они работают, попытайтесь обновить пакеты и контролировать результаты. –

+0

Привет, Тэйзер, спасибо за ответ. Да, похоже, что он упал до плохой установки в пакетах nuget. Спасибо, что указали, где был назначен токен. Метод «Authenticated» не стрелял и не устанавливал токен внешнего доступа. Я выполнил переустановку пакета nuget со следующей версией; Клиентская библиотека Google.Apis.Oauth2.v2 1.10.0.1000 –

ответ

1

ExternalAccessToken - обычная почта добавлен. Пожалуйста, проверьте следующий код, который распространяется на поставщиков по умолчанию.

Для Google

public class GoogleAuthProvider : IGoogleOAuth2AuthenticationProvider 
    { 
     public void ApplyRedirect(GoogleOAuth2ApplyRedirectContext context) 
     { 
      context.Response.Redirect(context.RedirectUri); 
     } 

     public Task Authenticated(GoogleOAuth2AuthenticatedContext context) 
     { 
      context.Identity.AddClaim(new Claim("ExternalAccessToken", context.AccessToken)); 
      return Task.FromResult<object>(null); 
     } 

     public Task ReturnEndpoint(GoogleOAuth2ReturnEndpointContext context) 
     { 
      return Task.FromResult<object>(null); 
     } 
    } 

Для Facebook

public class FacebookAuthProvider : FacebookAuthenticationProvider 
    { 
     public override Task Authenticated(FacebookAuthenticatedContext context) 
     { 
      context.Identity.AddClaim(new Claim("ExternalAccessToken", context.AccessToken)); 
      return Task.FromResult<object>(null); 
     } 
    } 

В этих классах добавляется требование, используя следующую строку;

context.Identity.AddClaim(new Claim("ExternalAccessToken", context.AccessToken)); 
Смежные вопросы