【问题标题】:How to restrict google oauth 2.0 to particular domain only in asp.net core web application?如何仅在 asp.net 核心 Web 应用程序中将 google oauth 2.0 限制为特定域?
【发布时间】:2018-07-12 11:43:21
【问题描述】:

我正在使用 asp.net 核心 Web 应用程序,我想将登录限制在特定域,例如 @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 正在运行,但我只想限制对特定域的访问,该怎么做?

【问题讨论】:

  • 相关问题:stackoverflow.com/questions/10858813/… 它说你的挑战需要一个 hd 参数。这也意味着它需要 OpenIdConnect,但 Google 的 API 有很多重叠。您可以通过将?hd=mydomain 添加到 Options.AuthorizationEndpoint 来添加此参数。或者使用 OnRedirectToAuthorizationEndpoint 事件。

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


【解决方案1】:

从 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?

【讨论】:

    猜你喜欢
    • 2020-08-22
    • 2015-01-15
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2017-06-17
    • 2019-01-25
    相关资源
    最近更新 更多