从 Visual Studio 的“Web API”项目模板开始,我尝试向/Api/Account/ExternalLogin
端点创建的令牌添加自定义声明。我通过回调添加这些FacebookAuthenticationProvider.OnAuthenticated
,但它们不会持续到OAuthAuthorizationServerProvider.AuthorizationEndpointResponse()
.
注意:我正在使用 Rahul Nath 在他的文章ASP.NET Web API 和外部登录 - 使用社交网络进行身份验证 中记录的类似方法
代码
在我Startup.Auth.cs
的类的ConfigureAuth()
方法(从OwinStartup
类的Configuration()
方法中调用)中,我向属性添加了一个回调函数OnAuthenticated
,以便设置单个声明,foo
其值为bar
:
var facebookAuthenticationProvider = new FacebookAuthenticationProvider()
{
OnAuthenticated = (context) =>
{
context.Identity.AddClaim(new Claim("foo", "bar"));
return Task.FromResult(0);
}
};
然后我将FacebookAuthenticationProvider
实例添加到一个新FacebookAuthenticationOptions
对象:
var facebookAuthenticationOptions = new FacebookAuthenticationOptions()
{
AppId = "XXXX",
AppSecret = "YYYY",
Provider = facebookAuthenticationProvider
};
并将其传递给 OWIN 的UseFacebookAuthentication()
方法:
app.UseFacebookAuthentication(facebookAuthenticationOptions);
结果
如果我在回调中放置一个断点,OnAuthenticated
我可以看到正在添加我的自定义声明,以及许多其他声明(包括来自urn:facebook
命名空间的几个声明)。到目前为止,一切都很好。
AuthorizationEndpointResponse()
但是,当我在 Facebook 身份验证后通过我的类的方法检查我的声明时,集合OAuthAuthorizationServerProvider
中只有两个可用的声明:context.Identity.Claims
- http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier
- http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name
所有urn:facebook
声明都已删除,我的自定义foo
声明也是如此。我假设管道中的其他位置正在使用一组准系统声明重新创建身份,但我不确定在哪里。
想法?