Facebook身份验证访问主体

Facebook身份验证访问主体,facebook,authentication,cookies,asp.net-core-2.0,asp.net-core-middleware,Facebook,Authentication,Cookies,Asp.net Core 2.0,Asp.net Core Middleware,我有一个带有自定义身份验证方案的.net核心web API。现在我正试图建立一个facebook登录并访问创建的索赔原则 以下代码适用于cookie: services.AddAuthentication() .AddCookie() .AddFacebook(config => { // appid and secret set up here config.CallbackPath = "/externalLogin";

我有一个带有自定义身份验证方案的.net核心web API。现在我正试图建立一个facebook登录并访问创建的索赔原则

以下代码适用于cookie:

services.AddAuthentication()
    .AddCookie()
    .AddFacebook(config => {
        // appid and secret set up here
        config.CallbackPath = "/externalLogin";
        config.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    });
使用此代码,一旦我对操作使用了
[Authorize(AuthenticationSchemes=FacebookDefaults.AuthenticationScheme)]
,它将使用cookies登录,我可以通过
User.Identity
属性访问主体

我试图在通过登录方案将此主体设置到cookie之前获取它。我已尝试为此设置自定义方案:

services.AddAuthentication()
    .AddScheme<ExternalOptions, ExternalLogin>(ExternalLogin.SchemeName, config => { })
    .AddFacebook(config => {
        // appid and secret set up here
        config.CallbackPath = "/externalLogin";
        config.SignInScheme = ExternalLogin.SchemeName;

    });
services.AddAuthentication()
.AddScheme(ExternalLogin.SchemeName,config=>{})
.AddFacebook(配置=>{
//这里设置了appid和secret
config.CallbackPath=“/externalLogin”;
config.signnscheme=ExternalLogin.SchemeName;
});
我已经为scheme定义了空类:

public class ExternalOptions : AuthenticationSchemeOptions { }

public class ExternalLogin : AuthenticationHandler<ExternalOptions>
{

    public const string SchemeName = "External";

    public ExternalLogin(IOptionsMonitor<ExternalOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) 
        : base(options, logger, encoder, clock)
    {

    }
    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // need to access the principal here
        return AuthenticateResult.Fail("Failed!");
    }
}
公共类外部选项:AuthenticationSchemeOptions{}
公共类外部登录:AuthenticationHandler
{
公共常量字符串SchemeName=“外部”;
公共外部登录(IOptionsMonitor选项、iLogger工厂记录器、URLCoder编码器、ISystemClock时钟)
:基本(选项、记录器、编码器、时钟)
{
}
受保护的重写异步任务handleAuthenticateAync()
{
//需要在这里访问委托人吗
返回AuthenticateResult.Fail(“Failed!”);
}
}
我尝试在
return AuthenticateResult.Fail(“Failed!”)
上使用调试器,但找不到包含主体信息的属性


注意:我需要确保没有用于维护无状态的cookie,以防客户端的cookie被阻止(我想这会造成问题)。无论哪种方式,在Web API上启用Cookie都被认为是不好的。其次,其目的是建立一个外部身份验证,该身份验证可以在以后的外部登录(如谷歌和微软)中重复使用

可以通过scheme
选项在身份验证过程的各个点访问
ClaimsPrincipal
。Events
(每个scheme定义自己的事件)

在这里,您可以使用cookies事件。例如:

服务
.AddAuthentication()
.AddCookie(选项=>
{
//有各种事件,请务必使用
//适合您的用例的
options.Events.OnValidatePrincipal=(上下文)=>
{
var-principal=context.principal;
//拒绝校长?
if(principal.Identity.Name!=“MyUser”)
context.RejectPrincipal();
//每个事件都需要一个任务
返回Task.CompletedTask;
};
)
.AddFacebook(配置=>{
//这里设置了appid和secret
config.CallbackPath=“/externalLogin”;
config.signnscheme=CookieAuthenticationDefaults.AuthenticationScheme;
});