par*_*ent 8 c# oauth-2.0 asp.net-identity asp.net-identity-2
我正在使用ASP.Net Identity来实现外部登录.用户登录Google后,我会获得谷歌的外部访问令牌.然后我对ObtainLocalAccessToken()进行第二次api调用,该调用将外部访问令牌换成新的本地访问令牌.
ObtainLocalAccessToken()
调用VerifyExternalAccessToken(),它通过手动进行http调用和解析user_id来验证提供者的外部访问令牌.
如何利用ASP.NET标识删除整个方法VerifyExternalAccessToken()
?
我相信这[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
是为了不是吗?我想ObtainLocalAccessToken()
用该属性修饰端点并在header({'Authorization' : 'Bearer xxx' }
)中发送external_access_token ,它应该填充User.Identity
而无需手动验证外部访问令牌?我相信这是目的,但我不能让它发挥作用.我从谷歌发送一个有效的外部访问令牌,它被401拒绝.
我在Startup.Auth btw中有这一行:
app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(),
AuthorizeEndpointPath = new PathString("/AccountApi/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
});
Run Code Online (Sandbox Code Playgroud)
或者,可以使用"/ Token"端点来交换本地端口的外部访问令牌?哪种方法是正确的?
研究Taiseer Joudeh的实施情况
在/ExternalLogin
端点替换OWIN验证挑战.
当在Identity Provider中找不到外部认证用户时,AngularJS LoginController
会调用authService.obtainAccessToken:
if (fragment.haslocalaccount == 'False') {
...
}
else {
//Obtain access token and redirect to orders
var externalData = { provider: fragment.provider,
externalAccessToken: fragment.external_access_token };
authService.obtainAccessToken(externalData).then(function (response) {
$location.path('/orders');
Run Code Online (Sandbox Code Playgroud)
它使用VerifyExternalAccessToken对Google和Facebook API 执行反向查找,以获取持有者令牌的声明信息.
if (provider == "Facebook")
{
var appToken = "xxxxxx";
verifyTokenEndPoint = string.Format("https://graph.facebook.com/debug_token?input_token={0}&access_token={1}", accessToken, appToken);
}
else if (provider == "Google")
{
verifyTokenEndPoint = string.Format("https://www.googleapis.com/oauth2/v1/tokeninfo?access_token={0}", accessToken);
}
else
{
return null;
}
Run Code Online (Sandbox Code Playgroud)
如果找到令牌,它将返回一个新的ASP.NET承载令牌
var accessTokenResponse = GenerateLocalAccessTokenResponse(user.UserName);
return Ok(accessTokenResponse);
Run Code Online (Sandbox Code Playgroud)
随着[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
该OWIN中间件使用外部承载令牌来访问第三方的Cookie和注册新账号(或找到现有的).
OWIN中间件不能配置为接受外部承载令牌而不是本地授权令牌.外部承载令牌仅用于身份验证和注册.