WindowsとAnonymous。Net Core 2.空のWebアプリで認証を混在させようとしています。 Mvcやコントローラーを使用したくないので、[Authorize]属性を避けたいです。
私のセットアップは次のとおりです:
空の.Net Core 2.0 Webアプリケーションを作成しました
プロジェクトのプロパティ->デバッグ->「Windows認証を有効にする」にチェックを入れ、「匿名認証を有効にする」を無効にしました。 「windowsAuthentication」:trueと「anonymousAuthentication」:falseが「IIS」の下のlaunchSettings.jsonに表示されるようになりました。
Startup.cs内のConfigureServicesに、 https://docs.Microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identityで述べたようにservices.AddAuthentication(Microsoft.AspNetCore.Server.IISIntegration.IISDefaults.AuthenticationScheme);
を追加しました-2x#windows-authentication-httpsys--iisintegration
単純なConsole.WriteLine(context.User.Identity.Name);
を追加して、app.Run内で機能することを確認し、...すべて機能します。
しかし... launchSettings.jsonで "anonymousAuthentication"をtrueに設定するとすぐに機能しなくなり、Windows認証を機能させるために何ができるかわかりません。 Context.User.Identity.IsAuthenticated
は常にfalseです。ご覧のとおり、私の構成は非常に単純であり、この方法を維持するために必要です。特定の動的ルートでWindows認証を有効/無効にしたいので、[Authorize]属性を持つコントローラーを使用することはできません。
私が達成しようとしているのは、「/ authenticated」というURLがcontext.User.Identity.Name
という値で応答し、「/ public」というURLが「これは公開ページです!」というような応答を返す単純なアプリです。 。 ASP.NET Coreの特定のルートでのNTLM認証 に似ていますが、[Authorize]属性とコントローラーがありません。リソースが非常に少ない...誰もが私が何が欠けているかもしれないという考えを持っていますか?ありがとう!
匿名が優先されます。アプリの制限された部分への匿名リクエストを受け取った場合、httpContext.ChallengeAsync()を呼び出す必要があります。これにより、クライアントは次の要求で資格情報を送信します。 これを行うテストは次のとおりです 。
トラッチャーの答えは、このトピックについていくらか時間を浪費した後、私を救いました。非常に単純なシナリオ(匿名コントローラー+残りはWindows認証が制限されています)のクイックスタート(ミドルウェア)は次のとおりです。
public class NtlmAndAnonymousSetupMiddleware
{
private readonly RequestDelegate next;
public NtlmAndAnonymousSetupMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext context)
{
if (context.User.Identity.IsAuthenticated || context.Request.Path.ToString().StartsWith("/Anonymous"))
{
await next(context);
return;
}
await context.ChallengeAsync("Windows");
}
}
これをStartup.Configure
メソッドの最初に差し込みました。
app.UseMiddleware<NtlmAndAnonymousSetupMiddleware>();