【问题标题】:ASP.NET Core 2.0 authentication based on host name基于主机名的 ASP.NET Core 2.0 身份验证
【发布时间】:2018-04-30 16:41:44
【问题描述】:

我会说带有身份验证的经典 ASP.NET Core 2.0 应用程序包括在 Startup.cs 文件的 ConfigureServices 方法中添加所需的身份验证服务:

services.AddAuthentication().AddFacebook(facebookOptions =>
{
    facebookOptions.AppId = Configuration["Authentication:Facebook:AppId"];
    facebookOptions.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
});

只要在调用ConfigurationServices 方法时知道身份验证配置并且对所有请求都相同,就可以了。

我们的案例需要不同的身份验证配置,比如说基于主机名:

company1.example.com // has own authentication configuration
company2.example.com // has own (probably different) authentication

更多详情,company1 仅配置了 Facebook,company2 仅配置了 Google 身份验证。

问题:是否可以对每个主机或每个请求进行不同的身份验证?例如,一旦我知道公司,我就可以加载和使用与此请求相关的身份验证配置。

【问题讨论】:

    标签: c# authentication asp.net-core-2.0


    【解决方案1】:

    有几种方法可以做到这一点。包括使用您的 IConfiguration 或访问 http 上下文作为您的 facebook 和 google 计划事件中的服务。这是执行此操作的最干净的方法之一。您可以制作自己的方案,如下所示:

    public class MyCustomAuth : AuthenticationHandler<AuthenticationSchemeOptions>
    {
    
        public const string SchemeName = "MyCustom";
    
        public MyCustomAuth(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory 
            logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
        {
        }
    
        protected override async Task HandleChallengeAsync(AuthenticationProperties properties)
        {
            if (Request.Host.Value == "")
            {
                await Context.ChallengeAsync(GoogleDefaults.AuthenticationScheme);
            }
            await Context.ChallengeAsync(FacebookDefaults.AuthenticationScheme);
        }
    
        protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
        {
            if (Request.Host.Value == "")
            {
                return await Context.AuthenticateAsync(GoogleDefaults.AuthenticationScheme);
            }
            return await Context.AuthenticateAsync(FacebookDefaults.AuthenticationScheme);
        }
    }
    

    您可以将所有内容添加到您的启动中并进行如下设置:

    services.AddAuthentication(MyCustomAuth.SchemeName)
            .AddCookie(...)
            .AddFacebook(...)
            .AddGoogle(...)
            .AddScheme<AuthenticationSchemeOptions, MyCustomAuth>(MyCustomAuth.SchemeName, opts => { });
    

    【讨论】:

      猜你喜欢
      • 2018-07-19
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      • 2018-06-23
      • 2015-05-16
      • 2019-10-31
      相关资源
      最近更新 更多