GetExternalLoginInfoAsync的实现与LiveAuthClient.GetUserId(authToken)不同?

时间:2014-07-14 21:05:52

标签: c# asp.net-mvc asp.net-mvc-5 owin live-sdk

任何人都可以帮助阐明Live SDK(v5.6)的实现与Microsoft.AspNet.Identity.Owin.dll中发生的事情有关吗?

通过以下方式成功验证后返回的用户ID:

//MVC5 UserController for SSO with Microsoft Account
var result = await AuthenticationManager.GetExternalLoginInfoAsync();
var userId = result.Login.ProviderKey;

...与返回的身份不同:

//WebAPI 2 custom AuthFilter (performs HMAC, etc)
var liveAuthClient = new LiveAuthClient(clientKey, secretKey, redirectUrl);
var userId = liveAuthClient.GetUserId(authTokenFromHttpHeader);

在这两种情况下,Windows Phone 8客户端应用程序,MVC5 WebApp和WebAPI 2都使用相同的ClientId和ClientSecret。

MVC5网站返回的id长度为16个字符,而从身份验证令牌中提取的id为32个字符。

我认为客户端应用中的id可能是MD5哈希值,但如果我尝试哈希值,它们仍然不匹配。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我终于解决了这里发生的事情,似乎LiveAuthClient返回的ID在某种程度上特定于Live SDK,没有任何按摩方式可以让我得到我需要的东西。

相反,WP8.1中的WebAuthenticationBroker Silverlight应用程序指向https://login.live.com/oauth20_authorize.srf?client_id=the_clientid&scope=wl.signin&response_type=token&display=touch(其中'the_clientid'是实际的ClientID)我能够检索一个access_token然后可以用来访问原始用户ID如下:

//get the UID
var accessToken = "the_token"; //replace with actual token
var meUri = new Uri(string.Format("https://apis.live.net/v5.0/me/?access_token={0}", accessToken));

var httpClient = new HttpClient();               
var response = await httpClient.GetAsync(meUri);
var responseString = await response.Content.ReadAsStringAsync();
var meObj = new { Id = ""};

meObj = JsonConvert.DeserializeAnonymousType(responseString, meObj);

meObj.Id是MD5哈希值时,它与MVC5 Web应用程序返回的ProviderKey完全匹配!

在理解如何实现WebAuthenticationBroker片段时,非常有用的两个链接:

http://msicc.net/?p=4054(Windows运行时应用)

http://msicc.net/?p=4074(Silverlight 8.1应用)