Facebook身份验证访问主体

时间:2018-01-29 00:25:13

标签: 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";
        config.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    });

使用此代码,一旦我对某个操作使用[Authorize(AuthenticationSchemes = FacebookDefaults.AuthenticationScheme)],它就会使用Cookie登录,我可以通过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;

    });

我已经为方案定义了我的空类:

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!");
    }
}

我尝试在return AuthenticateResult.Fail("Failed!")上使用调试器,但我找不到包含主要信息的属性。

注意:我需要确保没有用于维护无状态的cookie以及客户端阻止其cookie(我想会产生问题)。无论哪种方式,在We​​b API上启用cookie都不合适。其次,目标是设置一个外部身份验证,以后可以在以后的外部登录中重复使用(例如google和ms)。

1 个答案:

答案 0 :(得分:1)

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

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

services
    .AddAuthentication()
    .AddCookie(options => 
    {
        // there are various events, be sure to use 
        // the appropriate one for your use case
        options.Events.OnValidatePrincipal = (context) =>
        {
            var principal = context.Principal;

            // reject the principal?
            if (principal.Identity.Name != "MyUser")
                context.RejectPrincipal();

            // each event expect a Task
            return Task.CompletedTask;
        };
    )
    .AddFacebook(config => {
        // appid and secret set up here
        config.CallbackPath = "/externalLogin";
        config.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    });