Asp.net mvc 3 正在正确验证以获取Google联系人。。。(C#/MVC3)

Asp.net mvc 3 正在正确验证以获取Google联系人。。。(C#/MVC3),asp.net-mvc-3,c#-4.0,oauth,gdata-api,Asp.net Mvc 3,C# 4.0,Oauth,Gdata Api,在这一点上,我有一个非常简单的MVC应用程序: 控制器: public class HomeController : Controller { public ActionResult Index() { ViewBag.Message = "Welcome!"; var qs = HttpContext.Request.QueryString; var keys = qs.AllKeys.ToList(); if

在这一点上,我有一个非常简单的MVC应用程序:
控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome!";

        var qs = HttpContext.Request.QueryString;
        var keys = qs.AllKeys.ToList();
        if (keys.Count > 0 && keys.Contains("token"))
        {
            Session["token"] = qs.Get("token");
            Models.GoogleContact gc = new Models.GoogleContact();
        }
        else
        {
            ViewBag.GoogleUrl = AuthSubUtil.getRequestUrl(HttpContext.Request.Url.AbsoluteUri, "https://www.google.com/m8/feeds/", false, true);
        }

        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}
internal class baseGoogle
{
    #region Private Properties
    internal const string googleContactToken = "cp";
    internal const string googleCalendarToken = "cl";
    internal string _authSubToken;
    internal GAuthSubRequestFactory _gAuthSubRequestFactory;
    internal RequestSettings _requestSettings;
    internal ContactsRequest _contactsRequest;
    internal ContactsService _contactsService;
    #endregion

    internal baseGoogle()
    {
#if DEBUG
        _authSubToken = HttpContext.Current.Session["token"].ToString();
        _gAuthSubRequestFactory = new Google.GData.Client.GAuthSubRequestFactory(googleContactToken, "Tester1");
        _requestSettings = new Google.GData.Client.RequestSettings(_gAuthSubRequestFactory.ApplicationName, _authSubToken);
        _contactsRequest = new Google.Contacts.ContactsRequest(_requestSettings);
        _contactsService = new Google.GData.Contacts.ContactsService(_gAuthSubRequestFactory.ApplicationName);
        _contactsService.RequestFactory = _gAuthSubRequestFactory;
#endif
    }
}
internal class GoogleContact : baseGoogle
{
    #region Public Properties
    [NotMapped]
    public Dictionary<string, Group> Groups { get; set; }
    #endregion

    public GoogleContact() : base()
    {
        // Get the list of contact groups...
        _requestSettings.AutoPaging = true;
        Feed<Group> fg = _contactsRequest.GetGroups();

        foreach (Group g in fg.Entries)
        {
            this.Groups.Add(g.Title, g);
        }

    }
}
我有一个主视图:

@{
    ViewBag.Title = "Home Page";
}

<p>Home Page...</p>

<a href="@ViewBag.GoogleUrl">Tie in with Google</a>
<br />
<br />
我的谷歌联系人类:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome!";

        var qs = HttpContext.Request.QueryString;
        var keys = qs.AllKeys.ToList();
        if (keys.Count > 0 && keys.Contains("token"))
        {
            Session["token"] = qs.Get("token");
            Models.GoogleContact gc = new Models.GoogleContact();
        }
        else
        {
            ViewBag.GoogleUrl = AuthSubUtil.getRequestUrl(HttpContext.Request.Url.AbsoluteUri, "https://www.google.com/m8/feeds/", false, true);
        }

        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}
internal class baseGoogle
{
    #region Private Properties
    internal const string googleContactToken = "cp";
    internal const string googleCalendarToken = "cl";
    internal string _authSubToken;
    internal GAuthSubRequestFactory _gAuthSubRequestFactory;
    internal RequestSettings _requestSettings;
    internal ContactsRequest _contactsRequest;
    internal ContactsService _contactsService;
    #endregion

    internal baseGoogle()
    {
#if DEBUG
        _authSubToken = HttpContext.Current.Session["token"].ToString();
        _gAuthSubRequestFactory = new Google.GData.Client.GAuthSubRequestFactory(googleContactToken, "Tester1");
        _requestSettings = new Google.GData.Client.RequestSettings(_gAuthSubRequestFactory.ApplicationName, _authSubToken);
        _contactsRequest = new Google.Contacts.ContactsRequest(_requestSettings);
        _contactsService = new Google.GData.Contacts.ContactsService(_gAuthSubRequestFactory.ApplicationName);
        _contactsService.RequestFactory = _gAuthSubRequestFactory;
#endif
    }
}
internal class GoogleContact : baseGoogle
{
    #region Public Properties
    [NotMapped]
    public Dictionary<string, Group> Groups { get; set; }
    #endregion

    public GoogleContact() : base()
    {
        // Get the list of contact groups...
        _requestSettings.AutoPaging = true;
        Feed<Group> fg = _contactsRequest.GetGroups();

        foreach (Group g in fg.Entries)
        {
            this.Groups.Add(g.Title, g);
        }

    }
}
内部类GoogleContact:baseGoogle
{
#区域公共财产
[未映射]
公共字典组{get;set;}
#端区
public GoogleContact():base()
{
//获取联系人组列表。。。
_requestSettings.autopage=true;
Feed fg=_contactsRequest.GetGroups();
foreach(前景条目中的g组)
{
本.组.添加(g.标题,g);
}
}
}
在我尝试迭代提要项之前,一切似乎都很正常。这会弹出一个401未经授权的错误

你知道它为什么这么做吗?我正在跟进文件

我使用的是API的1.7.0.1版本



注意:我发现了一个有一些不同代码的应用程序,猜猜看,这是可行的。现在来看看为什么半官方的方式不起作用!有人有什么想法吗?

经过一番周旋,我发现了一种实现我所需要的方法。首先,我无法找到使用OpenID授权令牌获取用户联系人、日历等信息的方法。我仍在寻找这样做的方法。()

我所做的是让一个人在他的个人资料中输入他的谷歌用户名和密码,然后通过GData连接到他们的信息。我的感觉是大多数人都不想这样做!(这是相当多余的!)

下面是我想出的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using Google.GData.Contacts;
using Google.GData.Extensions;

namespace myNameSpace
{
    /// 
    /// Summary description for GoogleContactService
    /// 
    public class GoogleContactService
    {
        #region Properties
        public static ContactsService GContactService = null;
        #endregion

        #region Methods
        public static void InitializeService(string username, string password)
        {
            GContactService = new ContactsService("Contact Infomation");
            GContactService.setUserCredentials(username, password);
        }
        public static List<ContactDetail> GetContacts(string GroupName = null)
        {
            List<ContactDetail> contactDetails = new List<ContactDetail>();
            ContactsQuery contactQuery = new ContactsQuery(ContactsQuery.CreateContactsUri("default"));
            contactQuery.NumberToRetrieve = 1000;

            if (!String.IsNullOrEmpty(GroupName))
            {
                GroupEntry ge = GetGroup(GroupName);
                if (ge != null)
                    contactQuery.Group = ge.Id.AbsoluteUri;
            }
            else
            {
                string groupName = "";
                GroupEntry ge = GetGroup(groupName);
                if (ge != null)
                    contactQuery.Group = ge.Id.AbsoluteUri;
            }

            ContactsFeed feed = GContactService.Query(contactQuery);
            foreach (ContactEntry entry in feed.Entries)
            {
                ContactDetail contact = new ContactDetail
                {
                    Name = entry.Title.Text,
                    EmailAddress1 = entry.Emails.Count >= 1 ? entry.Emails[0].Address : "",
                    EmailAddress2 = entry.Emails.Count >= 2 ? entry.Emails[1].Address : "",
                    Phone1 = entry.Phonenumbers.Count >= 1 ? entry.Phonenumbers[0].Value : "",
                    Phone2 = entry.Phonenumbers.Count >= 2 ? entry.Phonenumbers[1].Value : "",
                    Address = entry.PostalAddresses.Count >= 1 ? entry.PostalAddresses[0].FormattedAddress : "",
                    Details = entry.Content.Content
                };

                contact.UserDefinedFields = new List<UDT>();
                foreach ( var udt in entry.UserDefinedFields)
                {
                    contact.UserDefinedFields.Add(new UDT { Key = udt.Key, Value = udt.Value });
                }

                contactDetails.Add(contact);
            }

            return contactDetails;
        }
        #endregion

        #region Helpers
        private static GroupEntry GetGroup(string GroupName)
        {
            GroupEntry groupEntry = null;

            GroupsQuery groupQuery = new GroupsQuery(GroupsQuery.CreateGroupsUri("default"));
            groupQuery.NumberToRetrieve = 100;
            GroupsFeed groupFeed = GContactService.Query(groupQuery);
            foreach (GroupEntry entry in groupFeed.Entries)
            {
                if (entry.Title.Text.Equals(GroupName, StringComparison.CurrentCultureIgnoreCase))
                {
                    groupEntry = entry;
                    break;
                }
            }
            return groupEntry;
        }
        #endregion
    }

    public class ContactDetail
    {
        public string Name { get; set; }
        public string EmailAddress1 { get; set; }
        public string EmailAddress2 { get; set; }
        public string Phone1 { get; set; }
        public string Phone2 { get; set; }
        public string Address { get; set; }
        public string Details { get; set; }
        public string Pipe { get; set; }
        public string Relationship { get; set; }
        public string Status { get; set; }
        public List<UDT> UserDefinedFields { get; set; }
    }
    public class UDT
    {
        public string Key { get; set; }
        public string Value { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用Google.GData.Contacts;
使用Google.GData.Extensions;
名称空间myNameSpace
{
/// 
///GoogleContactService的摘要说明
/// 
公共类谷歌通讯服务
{
#区域属性
公共静态联系人服务GContactService=null;
#端区
#区域方法
公共静态void InitializeService(字符串用户名、字符串密码)
{
GContactService=新联系人服务(“联系人信息”);
GContactService.setUserCredentials(用户名、密码);
}
公共静态列表GetContacts(字符串GroupName=null)
{
List contactDetails=新列表();
ContactsQuery contactQuery=新建ContactsQuery(ContactsQuery.CreateContactsUri(“默认”));
contactQuery.NumberToRetrieve=1000;
如果(!String.IsNullOrEmpty(GroupName))
{
GroupEntry ge=GetGroup(GroupName);
如果(ge!=null)
contactQuery.Group=ge.Id.AbsoluteUri;
}
其他的
{
字符串groupName=“”;
GroupEntry ge=GetGroup(groupName);
如果(ge!=null)
contactQuery.Group=ge.Id.AbsoluteUri;
}
ContactsFeed feed=GContactService.Query(contactQuery);
foreach(feed.Entries中的ContactEntry)
{
ContactDetail联系人=新的ContactDetail
{
Name=entry.Title.Text,
EmailAddress1=entry.Emails.Count>=1?entry.Emails[0]。地址:“”,
EmailAddress2=entry.Emails.Count>=2?entry.Emails[1]。地址:“”,
Phone1=entry.Phonenumbers.Count>=1?entry.Phonenumbers[0]。值:“”,
Phone2=entry.PhoneNumber.Count>=2?entry.PhoneNumber[1]。值:“”,
Address=entry.PostalAddresses.Count>=1?entry.PostalAddresses[0]。格式化地址:“”,
详细信息=entry.Content.Content
};
contact.UserDefinedFields=新列表();
foreach(entry.UserDefinedFields中的var udt)
{
contact.UserDefinedFields.Add(newudt{Key=UDT.Key,Value=UDT.Value});
}
联系人详细信息。添加(联系人);
}
返回联系人详细信息;
}
#端区
#地区助手
私有静态GroupEntry GetGroup(字符串GroupName)
{
GroupEntry-GroupEntry=null;
GroupsQuery groupQuery=newgroupsquery(GroupsQuery.CreateGroupsUri(“默认”));
groupQuery.numbertorRetrieve=100;
GroupsFeed groupFeed=GContactService.Query(groupQuery);
foreach(groupFeed.Entries中的GroupEntry条目)
{
if(entry.Title.Text.Equals(GroupName、StringComparison.CurrentCultureIgnoreCase))
{
groupEntry=entry;
打破
}
}
返回分组条目;
}
#端区
}
公共类联系人详细信息
{
公共字符串名称{get;set;}
公共字符串EmailAddress1{get;set;}
公共字符串EmailAddress2{get;set;}
公共字符串Phone1{get;set;}
公共字符串Phone2{get;set;}
公共字符串地址{get;set;}
公共字符串详细信息{get;set;}
公共字符串管道{get;set;}
公共字符串关系{get;set;}
公共字符串状态{get;set;}
公共列表UserDefinedFields{get;set;}
}
公共类UDT
{
公共字符串密钥{get;set;}
公共字符串值{get;set;}
}
}

现在,想知道如何使用他们的OpenID登录,而不必询问他们的登录凭据

是否有完整源代码示例的最终解决方案?