花了几个小时在网上搜索用ASP。NET CORE 3.1,我必须承认,不幸的是,我无法在我的项目中找到任何可以使用的东西。我已经阅读了官方网站后面的文档,但最后,我仍然在为一个干净的实现而努力。
在ASP。NET Monsters有一个例子,但目标是reCAPTCHA V3,而不是reCAPTCHA企业。
这里还有一个很好的帖子谷歌ReCaptcha v3服务器端验证使用ASP。NET Core 5.0,但再次使用reCAPTCHA V3。
感谢您的帮助。
所以对我来说,我需要用一个有角度的前端用dotnet 5来实现google repathca。我相信你可以用原生javascript代替棱角分明的前端,但这花了我几个小时的时间进行研究,所以希望它能帮助人们。
首先,我必须启用reCAPTCHA Enterprise,为此,我去了https://cloud.google.com/recaptcha-enterprise/然后点击";转到控制台";按钮这把我带到了我的谷歌云平台。从这里我需要创建一个密钥,填写选项并保存。此密钥将被称为您的SITE_key。
--如果你正在使用ANGULAR,请阅读本文,否则跳过这一步,自己实现
在我使用的客户端上,你可以在这里找到它
为了实现这个组件,我将这个导入添加到我的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端点,我注入这个服务并调用它。下面是一个调用recatchaService的示例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
}
希望这能帮助到每个人,如果有任何问题,请问,我会编辑它,并用我错过的任何东西更新它。