4

我正在通过 WCF 数据服务设置 OAuth。我在尝试查询提供者用户密钥的数据源时遇到问题,因为在某些情况下,密钥是 URL。例如,对于谷歌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;
}

它对 twitter 非常有用,因为ProviderUseId它只是一个数字,但对于 google 和 yahoo 来说,它UserId是一个 URL,我无法让它匹配 - 即使我知道 URL 相同,它总是会得到 0 个结果。我正在转义 URL(否则查询会失败),但我怎样才能让它找到应该的匹配项?

=====编辑

我知道我可以通过首先查询提供者来使其工作 - 执行 ToList() 然后查询 ProviderUserId - 然后它不必编码,因为它不会通过 DataServices 发送。但我不喜欢将所有记录拉回单个提供商的网络中作为解决方法的想法。

4

1 回答 1

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();
    }
}
于 2012-12-20T20:37:33.650 回答