从社交登录提供商中返回流量,以在我的.NET Core 2.2 Web应用程序上创建本地帐户



我一直使用家庭烤制加第三方软件包的混合物来完成社交登录(Google,Facebook和Twitter特别是(。在我完全控制的情况下,我可以指定返回方法,然后捕获社交提供商的响应数据,将我想要的字段(名称,电子邮件地址和第三方ID(映射到我自己的本地模型以创建本地用户帐户然后指定哪种类型的帐户(管理员,常规用户等(。

使用.NET Core 2.2,一切似乎都在幕后发生,例如在Facebook中拨打/ME之后,我不知道如何捕获流量。幕后呼叫返回的json响应,我的本地应用程序然后将其映射到登录我的主张。这一切都很棒,但是我也想捕获该数据并在我自己的数据存储中创建本地用户帐户。p>我可以看到这一切都在提琴手中发生,所以我知道它仍在做这项工作,我只是不知道该如何利用它来提取我在此过程中所需的东西。在此处坚持使用Facebook的示例,我认为我可以更改facebookoptions.callbackpath属性。从那里获取数据。我可以手工完成整个过程的工作,但是所做的只是将.NET Core在该"位置"所做的幕后工作。

我想我只要用户对网站进行身份验证时,我就可以进行检查,以查看我是否需要添加或更新他们的本地会话,但这对我来说似乎过于贫民窟。我希望每次登录后每次会话一次。

任何指导或建议都将不胜感激。

tia

我找到了一种方法.events.scrotingticket exterion Ins in in adauthentication((instrup.cs。

从这里,我可以循环浏览我的索赔列表,将用户保存到本地数据存储,然后创建或更新本地用户信息。

如果这不是处理此问题的最佳方法,我会喜欢一些更好的方向。

tia

            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
                options =>
                {
                    options.LoginPath = new PathString("/account");
                })
            .AddFacebook(facebookOptions =>
                {
                    facebookOptions.AppId = Configuration["Authentication:Facebook:AppId"];
                    facebookOptions.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
                    facebookOptions.CallbackPath = new PathString("/account/facebook");
                    facebookOptions.Events.OnCreatingTicket = ctx =>
                    {
                        ExternalLoginProviderHelper.LoginLocally(ctx.Principal);
                        return Task.CompletedTask;
                    };
                })
            .AddGoogle(options =>
                {
                    options.ClientId = Configuration["Authentication:Google:ClientId"];
                    options.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
                    options.Events.OnCreatingTicket = ctx =>
                    {
                        ExternalLoginProviderHelper.LoginLocally(ctx.Principal);
                        return Task.CompletedTask;
                    };
        });

和我的助手类:

public class ExternalLoginProviderHelper
{
    public static void LoginLocally(ClaimsPrincipal claimsPrincipal)
    {
        foreach(Claim claim in claimsPrincipal.Claims)
        {
            // extract the claim information here (ID, Email address, name (surname, given name) etc)
            // make repository call to save information to the datastore and get a local user ID
        }
        // also set other claims for local user id, user type (admin, regular user) etc.
        ClaimsIdentity claimsIdentity = (ClaimsIdentity)claimsPrincipal.Identity;
        claimsIdentity.AddClaim(new Claim("usertype", "admin")); // this is just an example N/V pair
    }
}

相关内容

  • 没有找到相关文章

最新更新