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 サイトを作成する方法に関する代替ソリューションはありますか?