2015-03-03 71 views
2

我想实现以下功能:从Windows Phone的8.1(或通用)应用在登录网页API使用Live标识

  1. 用户登录到Live ID帐户。
  2. 应用程序访问我使用ASP.NET Web Api开发的Web Api 2
  3. 在此Web Api中,我需要验证用户。
  4. 后来,我想验证的Web应用程序相同的用户

下面是我在做什么,而这是行不通的。

在我的Windows Phone应用程序:

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

然后在我的网页API我有以下

public void ConfigureAuth(IAppBuilder app) 
{ 

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

} 

我注册http://myservice.cloudapp.net为重定向URL。

问题是身份验证不起作用,web 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); 

    }