Вы можете настроить GoogleOAuth2AuthenticationOptions в файле MVC5 Startup.Auth.cs, чтобы запросить токены доступа и обновления для использования с OAuth2 api Google.
В этом примере я собираю значения, переданные от google, к промежуточному программному обеспечению OWIN OAuth2 и добавляя их к утверждениям, доступным в вашем методе обратного вызова.
var googleCreds = new GoogleOAuth2AuthenticationOptions
{
ClientId = "[replace with your google console issued client id]",
ClientSecret = "[replace with your google console issued client secret]",
Provider = new Microsoft.Owin.Security.Google.GoogleOAuth2AuthenticationProvider
{
OnApplyRedirect = context =>
{
string redirect = context.RedirectUri;
redirect += "&access_type=offline";
redirect += "&approval_prompt=force";
redirect += "&include_granted_scopes=true";
context.Response.Redirect(redirect);
},
OnAuthenticated = context =>
{
TimeSpan expiryDuration = context.ExpiresIn ?? new TimeSpan();
context.Identity.AddClaim(new Claim("urn:tokens:google:email", context.Email));
context.Identity.AddClaim(new Claim("urn:tokens:google:url", context.GivenName));
if (!String.IsNullOrEmpty(context.RefreshToken))
{
context.Identity.AddClaim(new Claim("urn:tokens:google:refreshtoken", context.RefreshToken));
}
context.Identity.AddClaim(new Claim("urn:tokens:google:accesstoken", context.AccessToken));
if (context.User.GetValue("hd") != null)
{
context.Identity.AddClaim(new Claim("urn:tokens:google:hd", context.User.GetValue("hd").ToString()));
}
context.Identity.AddClaim(new Claim("urn:tokens:google:accesstokenexpiry", DateTime.UtcNow.Add(expiryDuration).ToString()));
return System.Threading.Tasks.Task.FromResult<object>(null);
}
}
};
googleCreds.Scope.Add("openid");
googleCreds.Scope.Add("email");
app.UseGoogleAuthentication(googleCreds);
Теперь вы можете получить доступ к этим значениям требований из своего метода обратного вызова. Например:
var loginInfo = AuthenticationManager.GetExternalLoginInfo();
string GoogleAccessCode = String.Empty;
if (loginInfo.ExternalIdentity.Claims.FirstOrDefault(c => c.Type.Equals("urn:tokens:google:accesstoken")) != null)
{
GoogleAccessCode = loginInfo.ExternalIdentity.Claims.FirstOrDefault(c => c.Type.Equals("urn:tokens:google:accesstoken")).toString();
}
В начале последовательности аутентификации или после того, как вы закончили работу с AuthenticationManager.GetExternalLoginInfo(), вы можете очистить внешние кук аутентификации, который плавает вокруг, чтобы предотвратить любое проблемное строительство дублирующего печенья до:
if (Request.Cookies[".AspNet.ExternalCookie"] != null)
{
var c = new System.Web.HttpCookie(".AspNet.ExternalCookie");
c.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(c);
}
Я понимаю, что мне нужно хранить маркер, у меня возникают проблемы _finding_ самих маркеров в объекты, которые у меня есть на стороне сервера. – DLeh