これは正しいアプローチであり、アドレスなどのユーザー情報をこのCookieに保存できますか?
フォーム認証はデフォルトでユーザーの詳細を暗号化されたCookieに保存するので、現在よりも安全です。
フォーム認証を使用すると、クライアントCookieに入る文字列コンテンツを指定できます。ただし、Cookieに保存する必要がある情報は、ユーザー識別子とロール識別子だけであると私は主張します。この情報は、リクエストごとにユーザーを認証および承認するために必要なすべてのものである必要があります。アドレスなどの追加情報は、Cookieに重みを加えるだけであり、必要に応じてサービスから取得できます。
フォーム認証を利用するには、system.webセクション内のweb.configにAuthentication要素を追加するだけです。
<authentication mode="Forms">
<forms loginUrl="~/Login/Home" timeout="60" />
</authentication>
サービスを呼び出してユーザーを検証した後、FormsAuthentication静的クラスを介してCookieデータを設定します。Cookieデータには、ユーザーの識別子(たとえば、ユーザーの名前を表示する場合)と役割の識別子(以下で説明)が含まれている必要があります。
var username = // get name from service
var role = // get role from service
FormsAuthentication.SetAuthCookie(username + "-" + role, keepUserLoggedIn);
同じクラスを使用して、ユーザーがサインアウトしたときにCookieを削除します。
FormsAuthentication.SignOut();
2番目の質問は、ユーザーがログインしたら、そのユーザーの役割をどのように知ることができるかということです。
asp.net MVCは、アプリケーションの領域を特定のユーザーのみに許可するための単純なメカニズムを提供します。コントローラクラスまたはアクションメソッドで属性を使用する[Authorise]
と、ログインしているユーザーのみがアクセスを許可されます。つまり、FormsAuthenticationCookieが存在するユーザーです。ログインしていないユーザーは、web.configのauthenication要素で指定されたLoginUrlにリダイレクトされます。
Authorize属性には、特定のロールのユーザーのみがコントローラー/メソッドにアクセスできるようにするオーバーロードもあります。これにより、「管理者」ロールにあるログインユーザーのみがコントローラーのアクションメソッドにアクセスできるようになります。
[Authroise("Admin")]
public class EditController : Controller
{}
次に、システムインターフェイスの独自の実装を作成する必要がありますRoleProvider
。インターフェイスには多くのメソッドが含まれていますが、すべてが必要なわけではありません。ユーザーがどの役割を果たしているかを確認するために実装する必要がある唯一のメソッドはですGetRolesForUser
。これは[Authorise]
、ユーザーが表示できるかどうかを判断するために属性によって使用されます。
public class MyRoleProvider : RoleProvider
{
public override string[] GetRolesForUser(string username)
{
var authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null && !String.IsNullOrEmpty(authCookie.Value))
{
var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
var roles = authTicket.UserData.Split(',')[1];
return roles.Split(';');
}
throw new MemberAccessException("User not logged in");
}
}
RoleProvider
次に、属性が開始されたときの実装を使用するようにアプリケーションに指示する必要がありますAuthorise]
。これは、system.web要素内のweb.configを介して実行されます。
<roleManager defaultProvider="MyRoleProvider" enabled="true">
<providers>
<clear />
<add name="MyRoleProvider" type="My.Namespace.MyRoleProvider" />
</providers>
</roleManager>
最後に、ユーザーがログインしたら、サイト全体をhttpsで表示する必要がありますか?誰でも利用できるが、ログインしているユーザーがアクセスしているエリアでさえも?
理想的には、そうです。ユーザーがログインし、FormsAuthentication Cookieを設定したら、そのCookieを外部からの傍受から保護する必要があります。これを防ぐには、アプリケーションのすべての領域にhttpsプロトコルを適用する必要があります。ユーザーの要求が傍受され、Cookieのコピーが作成された場合、「中間者」はブラウザにCookieのコピーを設定し、サイトの保護された領域にアクセスできます。MVCを使用すると、属性[RequireHttpsAttribute]
と同様に、特定のコントローラーまたはアクションメソッドでを使用できます。[Authorise]
MVC4には、この「グローバル」を適用する簡単な方法があります。WebプロジェクトのApp_Startフォルダーで、FilterConfig
クラスを見つけて、RegisterGlobalFilters
メソッドに次の行を含めます。
filters.Add(new RequireHttpsAttribute());