2009-05-27 12 views
1

ASP.NET MVCでカスタム認証を正常に使用しています。これは単に、User.Identityとコンテキスト内のオブジェクトの所有者との比較を含みます。ASP.NET MVC承認およびハイパーリンク

単純な条件で使用すると魅力的です。 1つのWebリクエストで2つのアクションを呼び出そうとすると、より複雑になります。

私のアプリケーションでオンザフライで生成される画像を表示したいとします。このイメージはコントローラによって生成されるため、物理的に存在しなくてもURLで参照することができます。私は、ユーザがログインしてそれを見るための所有者でなければならないと決めたので、私はそれに私の認証機構を適用する。

例:< IMG SRC =「http://myapplication.com/images/generate/3」/ >

私はそのアクションのハイパーリンクを経由してページにこのような画像が含まれている場合、私が認証することを期待しますイメージが生成されている間は、ユーザーは依然としてサーバー側のコンテキストになります。これは私のテストでは当てはまりません。認可チェックが機能しないため、イメージは表示されません。イメージコントローラでは、User.Identityは、ユーザーが署名していないかのように空です。

その間、同じユーザーがウェブサイトにサインインしているため、画像が正しく機能していなくても、自分のアイデンティティをコンテキストで参照し続けることができます。

私はしっかりと、このプロセスの仕事を作る方法を疑問に思う

...

はどうもありがとうございました!

Marc Lacoursiere RooSoft Computing inc。

答えて

1

Thread.CurrentPrincipal 

もコントローラで空である場合は、チェックした場合だけ不思議?同じ値を含める必要があります。

もう1つの提案は、セッションにUser.Identity値を格納することでしょうか?

+0

2つのリクエストが同じスレッドで行われることは確実ですか? – RooSoft

+0

なぜ2つのスレッドがあるのか​​わかりません。最初に、画像の実際のビットではなく、その内部にあなたのimgタグを付けてページをレンダリングするよう要求されます。次に、ブラウザがあなたのimgタグをレンダリングすると、あなたのイメージを取得するようコントローラに要求が行われます。どちらの場合も、アクティブなスレッドは1つだけです。 – Peter

+0

最初にASP.NET MVCのステートレスな性質のためにその事実に頼ることができるのだろうか... 理論的には、ロードバランシング設定では、2つの異なるサーバーで2つの要求を行うことができます。 2つの異なるスレッドを意味します。 – RooSoft

1

すべてのリクエストであなたの身元をglobal.asaxで設定する必要があります。私はこのためにカスタムプリンシパルとアイデンティティを使用しています。

private void Application_AuthenticateRequest(object sender, EventArgs e) 
{ 
    if (!Request.IsAuthenticated) 
    { 
     SetIdentity(new MyIdentity 
        { Type = UserType.Inactive, Id = int.MinValue }); 
    } 
    else 
    { 
     HttpCookie authCookie = Request.Cookies[ 
      FormsAuthentication.FormsCookieName]; 
     if (authCookie != null) 
     { 
      FormsAuthenticationTicket authTicket = 
        FormsAuthentication.Decrypt(authCookie.Value); 

      var identity = Repository.GetIdentity 
        (authTicket.Name, new HttpRequestWrapper(Request)); 
      SetIdentity(identity); 
     } 
    } 
} 

private void SetIdentity(MyIdentity identity) 
{ 
    Context.User = new MyPrincipal { Identity = identity }; 
    Thread.CurrentPrincipal = Context.User; 
} 

これは機能しますが、安全であるとは限りません。このコードを公開する前に、FormsAuthentication vulnerabilitiesでこの記事を読んでください。このコードでは、Cookieが有効であり、ハイジャックされていないことを前提としています。このコードでは示されていないこれらの脆弱性を減らすために実行できる追加のセキュリティ対策がいくつかあります。

1

ブラウザのサイトリンクがhttp:\ www.mysite.com(またはhttp:\ subdomain.mysite.com)で、アプリケーションでhttp:\ mysite.com \ image \ 5を使用している場合。フォーム認証はCookieを使用します。これらのCookieは、ドメインとサブドメインに属することがあります。
何が起きているのかを知るために、FireFoxをFireBugと共にインストールすることをお勧めします。サイトの[ネットとコンソール]タブを有効にして、ページを完全に更新します。これらのタブの1つ(Netタブに正確に)でリクエストが表示されます。リクエストの左側に「プラス」ボタンがあります。クリックすると、ヘッダーと応答のタブ(more detailed description of firebug)が表示されます。ヘッダータブを見て、FORMAUTH(またはフォームクッキー名として設定したもの)のようなものを探してみてください。あなたがそれを見ないなら、問題はドメインにあります。

関連する問題