2

私は現在、さまざまなタイプのユーザーがサイトにアクセスしてログインできるMVC4アプリケーションに取り組んでいます。ユーザーには、サイトのさまざまな領域にアクセスできるタイプAとBの2つの異なるカテゴリがあります。

ユーザーの認証は、認証プロバイダーへのサービスコールを介して行われ、ユーザーが認証されたかどうかのステータスと、名前、住所などのユーザー情報が返されます。この時点で、ユーザーが認証されたことを追跡したいと思います。以前は、ユーザー名、アドレスなどを使用してCookieを作成し、クライアントのマシンに保存していました。しかし、Cookieはプレーンテキストであるため、これは操作の余地がありました。

ただし、サイトのセキュリティを強化したいので、FormsAuthenticationの使用を検討しています。私はそれがクッキーを生成することを知っていますが、それははるかに安全です。

これは正しいアプローチであり、アドレスなどのユーザー情報をこのCookieに保存できますか?保存したいセッションは利用できません。FormsAuthenticationでこれをどのように達成しますか?

2番目の質問は、ユーザーがログインしたら、そのユーザーの役割をどのように知ることができるかということです。

最後に、ユーザーがログインしたら、サイト全体をhttpsで表示する必要がありますか?誰でも利用できるが、ログインしているユーザーがアクセスしているエリアでさえも?ログインしたユーザーは、ウェルカムジョンなど、すべてのページの画面に情報が表示されます。

4

1 に答える 1

4

これは正しいアプローチであり、アドレスなどのユーザー情報をこの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());
于 2012-10-21T19:53:44.437 に答える