2

Web Api Web サービスへの AJAX 要求を行う静的 html ファイルとして実装された単一ページ アプリに取り組んでいます。IIS 7.5 でホストされています。

ユーザーが Web API サービス (Web サイトと同じマシン キーを共有している) に対して自分自身を認証している場合、静的 html ファイルの認証を機能させるのに問題があります。

私は基本的に、静的な .html ファイルを含む基本的な Web サイトと、Web Api Web サービスを使用する asp.net アプリケーションを持っています。ほとんどの静的 html ファイルは、認証されたユーザー (Web API アプリの /api/login ルートによって発行された有効な FormsAuthentication Cookie を使用した要求) のみが利用できる必要があり、これらのファイルは Web サイトのルートの下の「安全な」フォルダーにあります。 . Web Api ASP.NET アプリケーションは、Web サイトのルートの下にある「api」フォルダーにあります。

WebsiteRoot/ api/
secure/ login.html 1.html 2.html

これは正常に機能し、1.html のような静的ファイルは、/api ルートの下の Web API ルートに AJAX 要求を行うことができます。ここで、1.html と 2.html を secure/ 内に移動して、認証されたユーザーのみにアクセスを制限したいと考えています。

Web API サービス自体は FormsAuthentication を使用して、サービス ルートへのアクセスを制限します。ユーザーは /api/login ([AllowAnnonymous] で構成) に対して AJAX リクエストを行うことで認証します。この方法で認証されたユーザーだけに、secure/ フォルダー内の静的な .html ファイルへのアクセスを許可するようにします。

だから私の考えはこれです:

1) ASP.NET パイプラインが .html ファイルへの要求を処理することを確認します。

2) 静的 Web サイトでフォーム認証を有効にする

3) websiteroot/secure フォルダーへの匿名アクセスを拒否します。

4) /api/login に対する認証時に発行される Auth Cookie が、/secure フォルダーの認証メカニズムに対しても有効であることを確認します。

これを試してみましたが、現在、リクエストが認証されていても、websiteroot/secure 内のファイルへのアクセスが拒否されています (Web API アプリの /api/login ルートによって発行された .ASPFORMSAUTHI Cookie があります)。

これが私がやったことです: 私は3つのweb.configファイルを持っています: WebsiteRootに1つ、WebsiteRoot/api (Web APIアプリケーションのルート) に1つ、WebsiteRoot/secureに1つ

4) を確実にするために、FormsAuthentication をまったく同じように構成し、Web サイトのルート ファイルと websiteroot/api web.config ファイルの両方で同じマシン キーを使用しました。Cookie のドメインは、両方のファイルで同じに設定されています。

次に、1) を確実にするために、これを Web サイトのルート web.config ファイルに追加して、.html ファイル (すべてのファイル) が ASP.NET パイプラインによって処理および認証されるようにします。

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
          <add  name="FormsAuthenticationModule"  type="System.Web.Security.FormsAuthenticationModule" />
          <remove  name="UrlAuthorization" />
          <add  name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule"  />
          <remove  name="DefaultAuthentication" />
          <add  name="DefaultAuthentication"  type="System.Web.Security.DefaultAuthenticationModule" />
    </modules>
</system.webServer>

websiteroot/api/ にある Web API アプリケーションの web.config ファイルから関連するものを次に示します。

<system.web>
<authentication mode="Forms">
  <forms name=".ASPXFORMSAUTH" protection="All" path="/" domain=".mydomain.com" timeout="7200" slidingExpiration="true" />
</authentication>
<machineKey validationKey="SAME_IN_BOTH_FILES" decryptionKey="SAME_IN_BOTH_FILES" validation="SHA1" decryption="AES" />
<roleManager enabled="true" defaultProvider="simple">
  <providers>
    <clear />
    <add name="simple" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" />
  </providers>
</roleManager>
<membership defaultProvider="simple">
  <providers>
    <clear />
    <add name="simple" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
  </providers>
</membership>
...

websiteroot/ にある Web サイトのルート web.config ファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <authentication mode="Forms">
          <forms loginUrl="login.html" name=".ASPXFORMSAUTH" protection="All" domain=".mydomain.com" path="/" timeout="7200" slidingExpiration="true" />
        </authentication>
        <machineKey validationKey="SAME_IN_BOTH_FILES" decryptionKey="SAME_IN_BOTH_FILES" validation="SHA1" decryption="AES" />
    </system.web>
            <system.webServer>
                <modules runAllManagedModulesForAllRequests="true">
                      <add  name="FormsAuthenticationModule"  type="System.Web.Security.FormsAuthenticationModule" />
                      <remove  name="UrlAuthorization" />
                      <add  name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule"  />
                      <remove  name="DefaultAuthentication" />
                      <add  name="DefaultAuthentication"  type="System.Web.Security.DefaultAuthenticationModule" />
                </modules>
            </system.webServer>
</configuration>

websiteroot/secure/ にある web.config ファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <authorization>
            <deny users="?" />
        </authorization>
    </system.web>
</configuration>

注意してください、私が変更した場合

<deny users="?" /> 

<allow users="?" />  

次に、websiteroot/secure/ 内の .html ファイルへのアクセスが許可されます。

だから私の質問は:

1) /api/login によって発行された .ASPFORMSAUTH Cookie がリクエストに含まれている場合、/secure へのリクエストが拒否されるのはなぜですか?

2) 一部のファイルが同じサイトの Web API サービスに対して認証されたユーザーに制限されている静的 Web サイトを作成する方法に関する代替ソリューションはありますか?

4

1 に答える 1

4

すでにお気づきだと思いますが、直面している問題は、真の WebAPI 環境でのセッションレスに関係しています。フォーム認証は、クライアント側に保存されるセッション Cookie に基づいており、後続の各要求でサーバー側によって解釈されます。

WebAPI 呼び出しを介して認証している場合は、Cookie の作成/読み取りを直接処理する必要があります。この種の真に RESTful な実装を使用する主な利点の 1 つは、「セッション」自体を実際に持つ必要がないことです。

私のアプリケーションでは、これを処理する方法の 1 つとして、ユーザーの ID を一意に識別するデータ キーを使用し、サーバーだけが理解できる方法で暗号化して、クライアント側の Cookie に格納します。暗号化/復号化の方法などについて調べるためのより良いフォーラムがあるため、ここではセキュリティ要件の部分には触れませんが、基本的な取引は次のとおりです。

  1. クライアントの認証時に安全な Cookie を作成する
  2. ControllerそのCookieを解釈する方法を知っているオブジェクトの基本クラスを作成します

次に、次のいずれかを実行します。

1)設定したCookieに基づいて認証も処理する静的コンテンツのメッセージハンドラーを作成し、静的ファイルへのアクセス許可を確認します...

Controllerまたは 2)静的コンテンツを提供するアクションを持つ新しいを作成します。これには、基本コントローラー クラスから継承できるという利点があり、ステップ 2 から認証を無料で取得できます。

于 2013-02-28T20:25:15.740 に答える