問題があります。私の Web セキュリティは、確認時に常に false をスローします。私は何を間違っていますか?これが私の検証アクションです(デバッグしました。受け取ったIDは正しい確認トークンです:
public ActionResult Validate(String Id)
{
if (String.IsNullOrEmpty(Id))
{
return View();
}
bool b = WebSecurity.ConfirmAccount(Id);
if (b)
{
return View("ConfirmationSuccess");
}
return View("ConfirmationFailure");
}
そして、ここに私の登録アクションがあります:
public ActionResult Register(RegisterModel model, string ReturnUrl)
{
if (ModelState.IsValid)
{
// Попытка зарегистрировать пользователя
try
{
string confirmationToken = WebSecurity.CreateUserAndAccount(model.rEmail.ToLower(), model.rPassword, null, true);
dynamic email = new Email("~/Views/Emails/RegisterConfirmation.cshtml");
email.To = model.rEmail;
email.ConfirmationToken = confirmationToken;
email.Send();
return RedirectToAction("EmailValidation", new { Email = model.rEmail.ToLower() });
}
catch (MembershipCreateUserException e)
{
string field = string.Empty;
switch (e.StatusCode)
{
case MembershipCreateStatus.DuplicateUserName:
field = "rEmail";
break;
case MembershipCreateStatus.InvalidPassword:
field = "rPassword";
break;
default:
field = "RegisterForm";
break;
}
ModelState.AddModelError(field, ErrorCodeToString(e.StatusCode));
}
}
ViewBag.RegisterModel = model;
ViewBag.ReturnUrl = ReturnUrl;
ViewBag.LoginModel = new LoginModel();
//ModelState.AddModelError("rEmail", "Пользователь с таким e-mail уже зарегистрирован");
// Появление этого сообщения означает наличие ошибки; повторное отображение формы
return View("Login");
}
登録後、メールが送信され、リンクは正しいリンクですが、WebSecurity.ConfirmAccount(Id) に移動すると、常に false がスローされます....
お時間をいただきありがとうございます。下手な英語で申し訳ありません。
UPD: 私の IIS サーバーには、すべての URL を下げるためのコンバーターがあります。大文字と小文字を区別してキーを比較するのは事実でしょうか? どうすればこれを修正できますか?
UPD: OK、問題は実際には小文字の URL にあります。WebSecurity.ConfirmAccount は大文字と小文字が区別されます... 正しい ConfitmtionToken を取得できるように、アクションで少し回避策を講じましたが、これは完全に正しい方法ではありませんが、2 つの同一の ConfirmationToken.ToLower() があると思います。だから、誰か、それを行う正しい方法を教えてください。そして、ここに私の回避策があります:
public ActionResult Validate(String Id)
{
if (String.IsNullOrEmpty(Id))
{
return View();
}
//bool b = WebSecurity.ConfirmAccount(Id);
using (var ctx = new DBContext())
{
Id = ctx.wpMembership.Where(s => s.ConfirmationToken.Equals(Id, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().ConfirmationToken;
}
if (WebSecurity.ConfirmAccount(Id))
{
return View("ConfirmationSuccess");
}
return View("ConfirmationFailure");
}