如何在 ASP.NET 核心 3.0 身份中配置 Twitter 外部身份验证

How To Configure Twitter External Authentication in ASP.NET Core 3.0 Identity

我已将 Twitter 外部登录 NuGet 程序包添加到我的 ASP.NET Core 3 应用程序,如以下 Microsoft 页面所述。

Twitter external sign-in setup with ASP.NET Core

这是文档的一部分的屏幕截图: Configure Twitter Authentication DefaultScheme

现在我正在尝试访问和修改由 NuGet 安装自动设置的 /signin-twitter 默认回调。另外,我想设置我自己的 DefaultScheme 来处理身份验证。

我有 2 个问题。

  1. 如何访问和修改Twitter认证NuGet包自动设置的/signin-twitter默认回调中的代码?应用程序文件结构中没有 /signin-twitter 文件或组件。并且搜索没有找到任何文件中提到的“signin-twitter”文本。 /signin-twitter 代码位于何处?

  2. 在随附的屏幕截图中,您会看到措辞“AddAuthentication(String) 重载设置 DefaultScheme 属性”。但是该文档没有说明如何执行此操作的示例。如何使用 AddAuthentication(String) 设置我自己的 DefaultScheme 来处理身份验证?它应该是什么类型的代码文件?

如有任何帮助,我们将不胜感激。提前谢谢你。

我不太了解方案之类的,但是如果你想自定义Twitter回调,你需要自己制作TwitterOptionsTwitterHandler

如果你查看 AddTwitter 的源代码,发现 here,你可以看到它使用 TwitterOptionsTwitterHandler 类,这些基本上是告诉 OAuth 如何行为的配置。

return builder.AddRemoteScheme<TwitterOptions, TwitterHandler>(authenticationScheme, displayName, configureOptions);

如果您愿意,您似乎也可以通过身份验证方案。

Twitter Options

Twitter Handler

如果要自定义回调,则需要更改 HandleRemoteAuthenticateAsync

我还没有尝试过,但你可能会在下面做类似的事情。

MyTwitterHandler.cs

public class MyTwitterHandler: TwitterHandler  {

    protected override async Task<HandleRequestResult> HandleRemoteAuthenticateAsync()
    {
        var result = await base.HandleRemoteAuthenticateAsync();
        
        //write custom code here

        return result;
    }

}

Extensions.cs

public static AuthenticationBuilder AddMyTwitter(this AuthenticationBuilder builder, Action<TwitterOptions> configureOptions)
{
      builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IPostConfigureOptions<TwitterOptions>, TwitterPostConfigureOptions>());
      return builder.AddRemoteScheme<TwitterOptions, MyTwitterHandler>("MyAuthenticationScheme", TwitterDefaults.DisplayName, configureOptions);
}

Startup.cs

.AddMyTwitter(options => {

 });`
  1. 回调URL可以通过在设置推特验证时添加回调选项来自定义:

    services.AddAuthentication().AddTwitter(twitterOptions =>
    {
        ...
        twitterOptions.CallbackPath = new PathString("/signin-twitter2");
    });
    

    默认回调路径“/signin-twitter”定义自TwitterOptions.cs, which can be overridden above. The RemoteAuthenticationHandler.cs 将检查请求是否匹配此回调路径并采取行动。

    要在 successful Twitter login, define OnCreatingTicket event 上实施额外的业务逻辑:

    services.AddAuthentication().AddTwitter(twitterOptions =>
    {
        ...
        twitterOptions.Events = new TwitterEvents()
        {
            OnCreatingTicket = context =>
            {
                System.Diagnostics.Debug.WriteLine($"TwitterEvents.OnCreatingTicket: UserId = {context.UserId}");
                System.Diagnostics.Debug.WriteLine($"TwitterEvents.OnCreatingTicket: AccessToken = {context.AccessToken}");
                System.Diagnostics.Debug.WriteLine($"TwitterEvents.OnCreatingTicket: AccessTokenSecret = {context.AccessTokenSecret}");
                System.Diagnostics.Debug.WriteLine($"TwitterEvents.OnCreatingTicket: User = {context.User}");
                return Task.CompletedTask;
            }
        };
        ...
        // Commented because probably you are not asking for this
        //twitterOptions.CallbackPath = new PathString("/signin-twitter2");
    });
    
  2. 可以这样自定义身份验证方案:

    services.AddAuthentication(options => {
        ...
        options.DefaultChallengeScheme = "abc";
    })
    .AddTwitter("abc", options => {
        ...
    })
    

    您可以参考 official documentation 进一步说明。