【问题标题】:Google reCAPTCHA Enterprise with ASP.NET CORE 3.1带有 ASP.NET CORE 3.1 的 Google reCAPTCHA Enterprise
【发布时间】:2021-03-31 16:51:01
【问题描述】:

在网上搜索了几个小时以使用 ASP.NET CORE 3.1 实现 Google reCAPTCHA Enterprise 之后,很遗憾,我必须承认我无法找到可以在我的项目中使用的任何东西。 我已经阅读了official site 之后的文档,但最后,我仍然坚持一个干净的实现。

ASP.NET Monsters 中有一个示例,但针对的是 reCAPTCHA V3 而不是 reCAPTCHA 企业。

Google ReCaptcha v3 server-side validation using ASP.NET Core 5.0 这里也有一篇不错的帖子,但又是关于 reCAPTCHA V3。

感谢任何帮助。

【问题讨论】:

  • 您是否设法找到了这方面的详细信息?
  • 还没有。我经常在google、SO等上搜索,但所有帖子都是针对V3而不是企业版
  • 我修好了我的,现在一切正常
  • 您好 Gillardo,如果您能分享您的解决方案,那就太好了。提前谢谢了。我敢肯定,这将帮助许多其他在企业版中苦苦挣扎的开发人员。

标签: asp.net-core asp.net-core-mvc visual-studio-2019 recaptcha recaptcha-enterprise


【解决方案1】:

所以对我来说,我需要使用 dotnet 5 使用有角度的前端来实现 google recapthca。我相信你可以用原生 javascript 替换 angular 前端,但这花了我几个小时的调查时间,所以希望它会对人们有所帮助。

首先我必须启用 reCAPTCHA Enterprise,为此我去了https://cloud.google.com/recaptcha-enterprise/,然后单击“转到控制台”按钮。这把我带到了我的谷歌云平台。从这里我需要创建一个密钥,填写选项并保存。此密钥将称为您的 SITE_KEY。

-- 如果您使用 Angular,请阅读此内容,否则请跳过此步骤并自行实施

在我使用 ng-recaptcha 的客户端上,你可以找到它here

为了实现这个组件,我将此导入添加到我的 app.module.ts

import { RECAPTCHA_V3_SITE_KEY } from 'ng-recaptcha';

这是提供者部分

      {
          provide: RECAPTCHA_V3_SITE_KEY,
          useValue: SITE_KEY_GOES_HERE
      }

在我的组件上,当按下提交按钮时,我使用了上面库中的ReCaptchaV3Service。我的代码是这样的

this.recaptchaV3Service.execute(YOUR_ACTION_NAME).subscribe((recaptchaResponse) => {
    // now call your api on the server and make sure you pass the recaptchaResponse string to your method
    });

文本YOUR_ACTION_NAME 是您正在执行的操作的名称。在我的例子中,我通过 'forgotPassword' 作为这个参数。

-- 角部分结束

现在在服务器上,首先我将它包含到我的项目中

<PackageReference Include="Google.Cloud.RecaptchaEnterprise.V1" Version="1.2.0" />

一旦包含在我的服务中,我发现在我的代码中创建服务然后注入它会更容易。我还创建了一个基本的选项类,它被注入到我的服务中,如果需要,它可以注入到其他地方。

RecaptchaOptions.cs

    public class RecaptchaOptions
    {
        public string Type { get; set; }

        public string ProjectId { get; set; }

        public string PrivateKeyId { get; set; }

        public string PrivateKey { get; set; }

        public string ClientEmail { get; set; }

        public string ClientId { get; set; }

        public string SiteKey { get { return YOUR_SITE_KEY; } }

        /// <summary>
        /// 0.1 is worst (probably a bot), 0.9 is best (probably human)
        /// </summary>
        public float ExceptedScore { get { return (float)0.7; } }
    }

其中一些值未使用,但我已将它们添加以备将来使用,请附上我确实使用它们。

然后我创建了我的服务,看起来像这样(我创建了一个用于注入和测试的接口)

IRecaptchaService.cs

public interface IRecaptchaService
{
    Task<bool> VerifyAsync(string recaptchaResponse, string expectedAction);
}

RecaptchaService.cs

public class RecaptchaService : IRecaptchaService
{
    #region IRecaptchaService

    /// <summary>
    /// Check our recaptcha
    /// </summary>
    /// <param name="recaptchaResponse">The response from the client</param>
    /// <param name="expectedAction">The action that we are expecting</param>
    /// <returns></returns>
    public async Task<bool> VerifyAsync(string recaptchaResponse, string expectedAction)
    {
        // initialize request argument(s)
        var createAssessmentRequest = new CreateAssessmentRequest
        {
            ParentAsProjectName = ProjectName.FromProject(_recaptchaOptions.ProjectId),
            Assessment = new Assessment()
            {
                Event = new Event()
                {
                    SiteKey = _recaptchaOptions.SiteKey,
                    Token = recaptchaResponse
                }
            },
        };

        // client
        var cancellationToken = new CancellationToken();
        var client = RecaptchaEnterpriseServiceClient.Create();

        // Make the request
        try
        {
            var response = await client.CreateAssessmentAsync(createAssessmentRequest, cancellationToken);

            return response.TokenProperties.Valid && response.TokenProperties.Action.Equals(expectedAction) && response.RiskAnalysis?.Score >= _recaptchaOptions.ExceptedScore;
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);

            return false;
        }

    }

    #endregion

    private RecaptchaOptions _recaptchaOptions;

    public RecaptchaService(RecaptchaOptions recaptchaOptions)
    {
        _recaptchaOptions = recaptchaOptions;
    }
}

现在我的 api 端点,我注入这个服务并调用它。这是一个调用 recaptchaService 的示例 API 方法。

public async Task<IActionResult> ForgotPasswordAsync([FromBody] ForgotPasswordModel model)
{
    // check our recaptchaResponse
    var verified = await _recaptchaService.VerifyAsync(model.RecaptchaResponse, "forgotPassword");

    if (!verified)
        throw new ApplicationException("Recaptcha failed, please try again");

    // successful, carry on
}

希望这对每个人都有帮助,如果有任何问题,请提出,我将对此进行编辑并更新我错过的任何内容。

【讨论】:

  • 应用默认凭证不可用如何处理?
  • 嗨史蒂夫,很抱歉我的回复晚了。对于凭据,您必须进入 Google Cloud Platform -> APIs & Services -> Credentials。从那里您可以创建您的凭证。之后,您将能够将它们下载为 json 文件。我已将这些信息存储在我的 secrets.json(在开发期间)和用于生产的 Azure KeyVault Secrets 中。
  • 要使用凭据,您必须使用 RecaptchaEnterpriseServiceClientBuilder()。
  • var credentials = new Dictionary&lt;string, string&gt;() { { "type" , Type }, { "project_id" , ProjectId}, { "private_key_id" , PrivateKeyId}, { "private_key" , PrivateKey}, { "client_email" , ClientEmail}, { "client_id" , ClientId}, { "auth_uri" , Auth_uri}, { "token_uri" , Token_uri}, { "auth_provider_x509_cert_url" , Auth_provider_x509_cert_url}, { "client_x509_cert_url" , Client_x509_cert_url} };
  • string jsonstring = JsonConvert.SerializeObject(credentials, Formatting.Indented); var jsonCredentials = jsonstring; RecaptchaEnterpriseServiceClientBuilder clientBuilder = new RecaptchaEnterpriseServiceClientBuilder() {}; clientBuilder.JsonCredentials = jsonCredentials; var client = clientBuilder.Build();
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多