如何在运行时设置reCAPTCHA密钥设置

8

我正在实现谷歌的reCAPTCHA控件。

我从他们的示例中构建了一个简单的C#测试项目,一切正常。现在,我不想将PublicKey和PrivateKey放在aspx页面中,而是希望在运行时分配这些值,因为它们很可能会从web.config或数据库表中提取。

我在Page_Load中尝试了以下操作:

    protected void Page_Load(object sender, EventArgs e) {
        recaptcha.PublicKey = "<deleted for obvious reasons>";
        recaptcha.PrivateKey = "<ditto>";
    }

但是我收到一个错误提示,指出“reCAPTCHA需要配置公共和私有密钥。”

我还尝试重写页面的oninit方法并在那里分配值,但没有成功。

您有任何想法在哪里进行配置吗?

2个回答

17

尝试在标签中使用setincodebehind的值,像这样:

<recaptcha:RecaptchaControl ID="myRecaptcha" runat="server" 
  PublicKey="setincodebehind" PrivateKey="setincodebehind" ... />

这应该可以让您在代码后端正确地设置键。还有其他几种方法可以实现。例如,您可以像这样从静态类中获取值:

<recaptcha:RecaptchaControl ID="myRecaptcha" runat="server" 
  PublicKey="<%= RecaptchaSettings.PublicKey %>" 
  PrivateKey="<%= RecaptchaSettings.PrivateKey %>" ... />

你需要提供一个名为RecaptchaSettings的类。或者,你可以将密钥放入web.config文件的appSettings部分,并像这样访问它们:

<recaptcha:RecaptchaControl ID="myRecaptcha" runat="server" 
  PublicKey="<%$appSettings:RecaptchaPublicKey %>" 
  PrivateKey="<%$appSettings:RecaptchaPrivateKey %>" ... />

希望能对您有所帮助。


1
玩了一下,似乎 setincodebehind 可以是任何字符串。谢谢,这个很有效。 - goodeye
1
我在这方面摸索了一段时间 - 是的 - 在您的视图控件中必须有PublicKey和PrivateKey属性 - 但它们不需要正确的值。 如果它们不存在 - 当通过代码后台访问时,您会收到对象未设置为实例错误的消息。 - ajwaka
使用“setincodebehind”方法对我来说效果最好。谢谢! - Bryan

2
另一种设置键值的方法是使用 <appSettings>RecaptchaPublicKeyRecaptchaPrivateKey。除非在控件声明期间被覆盖,否则这些值将自动使用(参见mjd79的答案,第一种方法)。 优点:如果您有多个声明,只需在一个地方保留密钥即可遵循DRY原则。
此行为可以通过源代码看到:RecaptchaControl.cs,第135行-...
public RecaptchaControl()
{
    this.publicKey = ConfigurationManager.AppSettings["RecaptchaPublicKey"];
    this.privateKey = ConfigurationManager.AppSettings["RecaptchaPrivateKey"];
    ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接