我有两台具有不同域的服务器。
服务器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" });
}
}