使用MVC6进行Google身份验证

时间:2016-06-08 01:23:52

标签: authentication asp.net-core-mvc google-oauth

按照文档中的说明,我设置了Facebook身份验证,如下所示:

  "dependencies": {
    //blah blah snip
    "Microsoft.AspNetCore.Authentication.Facebook": "1.0.0-rc2-final"
  },

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
  //blah blah snip

  app.UseIdentity();

  // Add external authentication middleware below. To configure them please see http://go.microsoft.com/fwlink/?LinkID=532715
  app.UseFacebookAuthentication(new FacebookOptions()
  {
    AppId = Configuration["Authentication:Facebook:AppId"],
    AppSecret = Configuration["Authentication:Facebook:AppSecret"],

  });

  app.UseMvc(routes =>
  {
    routes.MapRoute(
              name: "default",
              template: "{controller=Home}/{action=Index}/{id?}");
  });
}

从Facebook购买AppId和AppSecret并使用SecretManager存储它们后,我解雇了它,于是Facebook登录成功并且非常高兴。

在成功的鼓舞下,我尝试按照相同的方式设置Google身份验证。

  "dependencies": {
    //blah blah snip
    "Microsoft.AspNetCore.Authentication.Facebook": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Authentication.Google": "1.0.0-rc2-final"
  },

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
  //blah blah snip

  app.UseIdentity();

  // Add external authentication middleware below. To configure them please see http://go.microsoft.com/fwlink/?LinkID=532715
  app.UseFacebookAuthentication(new FacebookOptions()
  {
    AppId = Configuration["Authentication:Facebook:AppId"],
    AppSecret = Configuration["Authentication:Facebook:AppSecret"],

  });

  app.UseGoogleAuthentication(new GoogleOptions()
  {
    ClientId = Configuration["Authentication:Google:ClientId"],
    ClientSecret = Configuration["Authentication:Google:ClientSecret"],
  });

  app.UseMvc(routes =>
  {
    routes.MapRoute(
              name: "default",
              template: "{controller=Home}/{action=Index}/{id?}");
  });
}

几乎有效但The redirect URI in the request, https://localhost:44391/signin-google, does not match the ones authorized for the OAuth client.

一项研究表明,重定向网址由GoogleOptions对象的CallbackPath属性的值提供,默认为" signin-google"。我没有登录google路径,CallbackPath = "/"在应用初始化期间产生未处理的远程故障(无论是什么),因此我将其删除并使用Google更新应用详细信息以允许https://localhost:44391/signin-google为重定向路径。

这促使我提示应用程序"离线访问",所以我做了。

但现在我使用这样的https://localhost:44391/signin-google?state=CfDJ8MbSjmyKVXJDoa23x_EQBp75rji1GdkCSc5HU6PFA1Ta534Ag-bZ3EtTcDpLaD5otpLXXQnqmPHRaUFbD2izzBoY_HM9vjJnVYcJNtRmkALdGQvMkcBc9J56UsJU9-uyYIGbsMMfgWhdkVry7Ssc76hJMwvjtDSFohWoqcGa7CxkFfrwfailX5QDmdfdFEtjy-txpt2c064lBpsjHUq4HeU9qIlMwq4T8yDtEsklATbkjlrVu-UvLMuTadraxVdd1s1m3NPe0LWFSkfukdhNoeEyBmkEgu3JBX4sevP3Yc29_zfojOglVxDFHTCtqDB-Tg&code=4/lFOCSBncHEH0RArYZrJ7Bd2p1URIzWxLTvJikXy1S1U&authuser=0&hd=assaohs.com.au&session_state=8b968ac03c755e48f2c1479fea9c02b9ccaa292a..4748&prompt=none#

这样的网址获得403 Forbidden

我尝试像这样设置范围

  var go = new GoogleOptions()
  {
    ClientId = Configuration["Authentication:Google:ClientId"],
    ClientSecret = Configuration["Authentication:Google:ClientSecret"],

  };
  go.Scope.Add("email");
  go.Scope.Add("profile");
  app.UseGoogleAuthentication(go);

有趣的是,默认范围是" openid"。添加"电子邮件"和"个人资料"范围在授权请求中没有产生任何差异。添加无效范围会产生错误,这意味着这些是有效的已识别范围。

使用Google开发者控制台为应用启用Google+ API可解决403 Forbidden错误,但出于逃避原因的原因,我们仍会提示您授予离线访问权限。

GoogleOptions对象的属性AccessType默认为null。将其设置为" online"似乎没有任何不同。

问题

我被提示授予离线访问权限。是什么让服务器认为我想离线访问?需要设置什么来防止这种情况?在GoogleOptions对象初始化程序

中设置AccessType = "online"
  var go = new GoogleOptions()
  {
    AccessType = "online",
    ClientId = Configuration["Authentication:Google:ClientId"],
    ClientSecret = Configuration["Authentication:Google:ClientSecret"],        
  };

似乎没有任何效果。这是正确的价值吗?

1 个答案:

答案 0 :(得分:1)

离线访问是一组不同范围的默认消息,电子邮件和配置文件是其中两个。没有办法更改消息,无法停止请求配置文件和电子邮件范围。

AccessType(在线,离线)并不是您的想法。脱机访问将返回刷新令牌,以便您以后可以访问其数据。在线访问意味着您只有在他们到达时才会访问他们的数据并且您不需要刷新令牌。