やあ、
エンドユーザーがアカウントを作成できるASP.NETMVCWebサイトを入手しました。ただし、最初にログインするときに同意を与える必要があります。同意しない場合は、ログインしている間、このサイトの他のWebページにアクセスできないようにする必要があります。
これは可能ですか?もしそうなら、どのように?
やあ、
エンドユーザーがアカウントを作成できるASP.NETMVCWebサイトを入手しました。ただし、最初にログインするときに同意を与える必要があります。同意しない場合は、ログインしている間、このサイトの他のWebページにアクセスできないようにする必要があります。
これは可能ですか?もしそうなら、どのように?
簡単な方法は、カスタムの承認属性を作成することです。以下のauthorize属性は、ユーザーが認証および承認されているかどうかを確認します。承認されている場合は、db呼び出しを行ってユーザーが確認されているかどうかを確認し、プライベート変数isNotConfirmed
をtrueに設定していない場合はfalseを返します。
HandleUnauthorizedRequest
で、認証の理由を確認する必要があります。失敗し、確認されていないことが原因である場合は、ユーザーを確認ページにリダイレクトできます。
public class CustomAuthorize : AuthorizeAttribute
{
bool isNotConfirmed = false;
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (base.AuthorizeCore(httpContext))
{
//if the user is not confirmed set isNotConfirmed true and return false;
isNotConfirmed = true;
// else return true;
}
return false;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (isNotConfirmed)
{
filterContext.Result = new RedirectResult("/Confirm");
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
これを行う最も簡単な方法は、ASP.Netメンバーシップおよびプロファイルプロバイダーを使用することです。
メンバーシッププロバイダーは、ユーザーを管理するためのすぐに使用できるインフラストラクチャ(パスワード、パスワードのリセットなど)を提供します。
プロファイルプロバイダーを使用すると、ユーザーがメンバーシップ契約に署名したかどうかのフラグなど、ユーザーに関する情報を保存できます。
ユーザーがログインしたら、プロファイルプロバイダーをチェックして、メンバーシップ契約に署名しているかどうかを確認します。そうでない場合は、適切なページにリダイレクトします。
アップデート
あなたのコメントに基づいて、あなたは以下を行うことができます:
ログインコントローラを編集する
[HttpPost]
[AllowAnonymous]
public ActionResult Login(LogOnModel model, string returnUrl)
....
if (!userHasSignedTheAgreement)
{
return RedirectToAction("Account", "ViewToAcceptAgreement");
}
else if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
....
契約に署名したら、ConfirmedUserなどの追加の役割に割り当てます。
次に、アクセスが制限されているコントローラーで、次を追加します。
[Authorize(Roles = "ConfirmedUser")]
この属性により、コントローラーを使用するには、ユーザーがConfirmedUserロールに属している必要があります。