2015-03-03 2 views
2

Я пытаюсь реализовать следующие функции:Войти с Универсальной App для веб-Апи с помощью Live ID

  1. признаки пользователя в INTO реальный счет Ид с Windows Phone 8.1 (или универсальные) приложения.
  2. App accesses Web Api, который я разрабатываю с помощью ASP.NET Web Api 2
  3. В этом веб-Api мне нужно аутентифицировать пользователя.
  4. Позже, я хочу, чтобы проверить подлинность того же пользователя в веб-приложение

Вот что я делаю, и он не работает.

В моей Windows Phone App:

var authClient = new LiveAuthClient("http://myservice.cloudapp.net"); 
LiveLoginResult result = await authClient.LoginAsync(new string[] { "wl.signin" }); 

if (result.Status == LiveConnectSessionStatus.Connected) 
{ 
    connected = true; 
    var identity = await ConnectToApi(result.Session.AuthenticationToken); 
    Debug.WriteLine(identity); 
} 

А потом

private async Task<string> ConnectToApi(string token) 
{ 
    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri("http://myservice.cloudapp.net/"); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); 

     // HTTP GET 
     HttpResponseMessage response = await client.GetAsync("api/values"); 
     if (response.IsSuccessStatusCode) 
     { 
      string result = await response.Content.ReadAsStringAsync(); 
      return result; 
     } 
     else 
      return response.ReasonPhrase; 
    } 
} 

И тогда в моем веб-апи я следующий

public void ConfigureAuth(IAppBuilder app) 
{ 

    app.UseMicrosoftAccountAuthentication(
     clientId: "my client id", 
     clientSecret: "my secret"); 

} 

Я зарегистрировал http://myservice.cloudapp.net в качестве URL переадресации.

Проблема заключается в том, что аутентификация не работает, действия веб-api не распознают пользователя.

ответ

2

Я понял это совершенно неправильно. Во-первых, мне действительно нужно использовать метод app.UseJwtBearerAuthentication. Пример был найден здесь http://code.lawrab.com/2014/01/securing-webapi-with-live-id.html. Но когда я попробовал, я получил эту ошибку на выходе

IDX10500: Signature validation failed. Unable to resolve SecurityKeyIdentifier: 'SecurityKeyIdentifier ( IsReadOnly = False, Count = 1, Clause[0] = System.IdentityModel.Tokens.NamedKeySecurityKeyIdentifierClause )

Это один взял меня некоторое время, чтобы выяснить, пока я не нашел этот пост: JwtSecurityTokenHandler 4.0.0 Breaking Changes?

Подставив эти вещи вместе, я получил решение, которое сейчас работает в моей тестовой среде:

public void ConfigureAuth(IAppBuilder app) 
    { 
     var sha256 = new SHA256Managed(); 
     var sKey = "<Secret key>" + "JWTSig"; 
     var secretBytes = new UTF8Encoding(true, true).GetBytes(sKey); 
     var signingKey = sha256.ComputeHash(secretBytes); 
     var securityKeyProvider = new SymmetricKeyIssuerSecurityTokenProvider("urn:windows:liveid", signingKey); 
     var securityKey = securityKeyProvider.SecurityTokens.First().SecurityKeys.First(); 

     var jwtOptions = new JwtBearerAuthenticationOptions() 
     { 
      //AllowedAudiences = new[] { "<url>" }, 
      //IssuerSecurityTokenProviders = new[] 
      //{ 
      // new SymmetricKeyIssuerSecurityTokenProvider("urn:windows:liveid",signingKey) 
      //}, 
      TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters() 
      { 
       IssuerSigningKeyResolver = (token, securityToken, keyIdentifier, validationParameters) => 
        { 
         return securityKey; 
        }, 
       ValidAudience = "<url>", 
       ValidIssuer = securityKeyProvider.Issuer 
      } 

     }; 
     app.UseJwtBearerAuthentication(jwtOptions); 

    }