我正在努力通过WCF数据服务设置OAuth。我在尝试查询提供者用户密钥的数据源时遇到问题,因为在某些情况下密钥是URL。例如,对于Google https://www.google.com/accounts/o8/id?id=AItOawnDT8v-6rdRI221piLFbOBT1m3EYTizmDQ
我有以下功能:
public override int GetUserIdFromOAuth(string provider, string providerUserId)
{
var encodedUserId = Uri.EscapeDataString(providerUserId);
var user = service.OAuthMemberships
.Where(o => o.Provider == provider &&
o.ProviderUserId == encodedUserId)
.SingleOrDefault();
if (user == null)
return -1;
return user.UserId;
}
它非常适合推特,因为ProviderUseId
只是一个数字,但对于谷歌和雅虎,其中UserId
是一个网址,我无法让它匹配 - 它总是出现0结果即使我知道URL是相同的。我正在逃避URL(否则查询会失败),但我怎么能让它找到匹配的呢?
=====修改
我知道我可以先通过查询提供程序来获取它 - 然后执行ToList()然后查询ProviderUserId - 然后就不必对其进行编码,因为它不会通过DataServices发送。但是我不喜欢将每条记录拉回到整个线路的单一提供商的想法,只是作为一种解决方法。
答案 0 :(得分:0)
为了解决这个问题,我设置了一个服务操作来处理这个问题,但是我仍然很好奇这个问题是否有“真正的”答案。
[WebGet]
public IEnumerable<OAuthMembership> GetOAuthUser(string provider,
string providerUserId)
{
providerUserId = Uri.UnescapeDataString(providerUserId);
using (var db = new WebsiteMembershipEntities())
{
return db.OAuthMemberships.Where(o=>o.Provider == provider &&
o.ProviderUserId == providerUserId)
.ToList();
}
}