web-dev-qa-db-ja.com

ASP.NET CoreアプリでWindows認証と匿名認証の両方を有効にします

これは以前にも何度も質問されてきたことを知っていますが、残念ながらASP.NET Core Webアプリではなく、古典的なASP.NET Webアプリについてです。 ASP.NET CoreアプリのIIS構成は従来のASP.NETとは大きく異なります。たとえば、ASP.NET CoreはKestrelプロキシを使用しているため、ASP.NETに関連する構成の多くはASP.NET Coreにはありません。 IISのアプリでの匿名認証とWindows認証の両方。これで終わりですが、それ以上に機能すると思います。

単一のasp.netコアWebアプリでこれらの両方の認証を有効にする手順は何ですか?

14
ashilon

IISはリバースプロキシとして機能し、ユーザーのWindows IDを設定し、Kestrelに送信します。そのため、最初にIISを設定して、Windows認証と匿名認証の両方を許可します。

enter image description here

次に、web.configを変更して、IISにWindows IDが(見つかった場合)をそのようなASP.NET Coreアプリケーションに送信するように変更する必要があります。 https: //stackoverflow.com/a/42163175/682724

この時点で、「[Authorize]」属性を使用してコントローラーアクションを作成すると、HttpContext.User.Identity.Name;には、クライアントが使用するWindows IDの値が必要です。私はここに似たものに答えました: ASP.NET Coreの特定のルートでのNTLM認証

良い点は、クライアントがWindows IDトークンを渡さない場合でも、標準のコントローラーアクションが機能する一方で、保護された([Authorize]タグを使用する)トークンは失敗することです。

PS:私はcurl.exeを冗長モードで使用して、承認プロトコル(ネゴシエートプロトコル、NTLMトークン...)

21
Daboul

ASP.NET Core 2.0アプリケーションについても同様のシナリオがあり(単一のコントローラーを除き、アプリ全体でWindows認証を使用します)、Daboulの説明では不十分でした。

anonymousが優先されるのでhere のようにカスタムミドルウェアを設定する必要がありました。

ミドルウェア

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.csでの使用:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseMiddleware<NtlmAndAnonymousSetupMiddleware>();

    // other code here
}

そのため、ミドルウェアはAnonymousControllerの匿名要求のみを受け入れ、Windows認証情報が提供されない場合はチャレンジを提供します。

匿名コントローラー

ミドルウェアは匿名で認証を必要とするものを区別するため、これは通常のコントローラーのように見えます。

[Route("Anonymous")]
public class AnonymousController : Controller
{
    [HttpGet("Echo")]
    public string Echo(string data)
    {
        return data;
    }
}

テスト

(すべてWindowsマシンで実行)

  1. Chrome +非匿名コントローラーアクションにアクセス=>正常に動作(両方とも@User.Identity.Nameおよび@Context.User.Identity.Name正しいユーザーを返す

  2. Chrome +匿名アクション=>直接動作

  3. Firefox(OSからNTLMチケットを直接転送しない)+非匿名=>モーダルはuser/passを要求します=>正しく提供されていれば正常に動作します

  4. Firefox +匿名アクション=>直接動作

5
Alexei