一台服务器可以提供验证码,另一台服务器可以使用吗?

时间:2019-02-14 08:54:39

标签: c# session .net-core cross-domain captcha

我有两台具有不同域的服务器。

服务器A的地址为http://127.0.0.1:46833(dotnet核心2.1应用程序)

在本地IIS上,服务器B的地址为http://127.0.0.1:88

服务器A提供验证码服务,服务器B使用提供的验证码服务。

这是在服务器A上创建验证码的方式:

[ApiController]
public class CaptchaController : ControllerBase
{

    [Route("get-captcha-image")]
    public IActionResult GetCaptchaImage()
    {
        //it returns captcha image
        var result = Captcha.GenerateCaptchaImage();

        //store captcha
        HttpContext.Session.SetString("CaptchaCode", result.CaptchaCode);

        Stream s = new MemoryStream(result.CaptchaByteData);
        return new FileStreamResult(s, "image/png");
    }

}

以下是服务器A上的其他主要实现方式:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHttpContextAccessor(); //inject httpContext
        services.AddMemoryCache(); //enable cache

        //cors
        services.AddCors(options =>
        {
            options.AddPolicy("local",
                builder => builder.WithOrigins("http://127.0.0.1:88").AllowAnyMethod().AllowAnyHeader().AllowCredentials());
        });

        // add session support
        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromMinutes(20);
            options.Cookie.HttpOnly = true;
        });

    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {

        //cors
        app.UseCors("local");

        // add session support
        app.UseSession();

    }
}

这是服务器B尝试使用提供的验证码的方式:

<form name="signup" action="" method="post">                  
    <input name="CaptchaCode" type="text" />
    <img src = "http://localhost:46833/api/captcha/get-captcha-image" />

    <input id="btnSignUp" type="button" />
</form>

最后,这就是服务器B将验证码输入发送回服务器A的方式:

$('#btnSignUp').click(function(){
    $.ajax({
      type: 'POST',
      url: "http://localhost:46833/api/service/register",
      data: JSON.stringify({
        'CaptchaCode': $('input[name=CaptchaCode]').val()
      }),
       xhrFields: {
          withCredentials: true
       },
      crossDomain: true,
      dataType: "json",
      contentType: "application/json"
    });     
});

register 方法中,令人遗憾的是,HttpContext.Session.GetString("CaptchaCode")的值为空,我无法对其进行验证。但是,当我使用postman或其他浏览器直接测试服务器A时,HttpContext.Session.GetString("CaptchaCode")的值不为null,并且会话和验证码工作正常。

[HttpPost("Register")]
public async Task<IActionResult> RegisterAsync([FromBody] RegisterInputs inputs)
{
      //here I check the value of HttpContext.Session.GetString("CaptchaCode")
      if (!Captcha.ValidateCaptchaCode(inputs.CaptchaCode, HttpContext))
      {
        return StatusCode(401, new { message = "security code is not valid" });
      }

}

0 个答案:

没有答案