首页 文章

如何仅在asp.net核心Web应用程序中将google oauth 2.0限制为特定域?

提问于
浏览
1

我正在使用asp.net核心网络应用程序,我想限制只登录@ domain.com这样的特定域名,我跟着这个视频涉及的几个步骤https://www.youtube.com/watch?v=eCQdo5Njeew用于谷歌外部认证,这是旧版本,我遵循了这个文档https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/google-logins?tabs=aspnetcore2x oauth正在运行,但我想限制对特定域的访问,如何做到这一点?

1 回答

  • 0

    从OAuth登录时限制域名不够可靠 . 我建议您按照Tackle more complex security policies for your ASP.NET Core app中的说明创建自定义安全策略 .

    首先,您需要一个要求:

    using Microsoft.AspNetCore.Authorization;
    
    public class DomainRequirement : IAuthorizationRequirement
    {
        public string Domain { get; }
    
        public DomainRequirement(string domain)
        {
            Domain = domain;
        }
    }
    

    然后,您需要一个处理器来满足此要求:

    using System.Security.Claims;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Authorization;
    
    public class DomainHandler : AuthorizationHandler<DomainRequirement>
    {
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
            DomainRequirement requirement)
        {
            var emailAddressClaim = context.User.FindFirst(claim => claim.Type == ClaimTypes.Email);
    
            if (emailAddressClaim != null && emailAddressClaim.Value.EndsWith($"@{requirement.Domain}"))
            {
                context.Succeed(requirement);
            }
    
            return Task.CompletedTask;
        }
    }
    

    有了这些,您可以在 Startup.cs 中添加新的授权策略,以便ASP.NET Core知道它:

    public void ConfigureServices(IServiceCollection services)
    {
        // ...
    
        services.AddAuthorization(options =>
        {
            options.AddPolicy("CompanyStaffOnly", policy => policy.RequireClaim(ClaimTypes.Email).AddRequirements(new DomainRequirement("company.com")));
        });
    
        // ...
    }
    

    最后,在控制器操作上添加 [Authorize] 时,可以参考此策略:

    [Authorize(Policy = "CompanyStaffOnly")]
    public IActionResult SomeAction()
    {
        // ...
    }
    

    如果要全局应用此策略,另请参阅How to add global AuthorizeFilter or AuthorizeAttribute in ASP.NET Core? .

相关问题