1. ホーム
  2. Web プログラミング
  3. ASP.NET
  4. 実用的なヒント

asp.net core3.1 cookieとjwtのハイブリッド認証による多様な認証ソリューションの実現

2022-01-14 13:30:46

asp.net core 3.1を使って社内システムを開発。開発では、シンプルなCookie認証方式でユーザー認証を行い、データを呼び出すために他のシステムとのインターフェースをいくつか書くように開発しました。そして、ほんのいくつかの簡単なインターフェイスは、サイトを再デプロイする準備ができていないので、それは直接MVCプロジェクトでインターフェイスを記述するためのAPI領域を追加することである。それはあなたが認証するためにクッキーの方法を使用することはできませんので、インタフェースであるため、この時間は、認証を認証するために様々な認証方式を使用して、jwtの認証を追加する必要があります。

認証のオーソリゼーション

認証は、ユーザーのアイデンティティを決定するプロセスです。認可は、ユーザーがリソースにアクセスできるかどうかを決定するプロセスです。ASP.NET Coreでは、認証はIAuthenticationServiceによって処理され、このサービスは認証ミドルウェアによって使用されます。認証サービスは、登録された認証ハンドラを使用して、認証関連の処理を行います。

認証-->権限付与

認証と認可については、認証と認可は2つの概念であることを区別する必要があり、MSDN公式ドキュメントを確認するか、他の記事を検索してください。OAuth 2.0やjwt関連の知識も含め、多くの情報と良い解説があります。 {OAuthの概念の一部を紹介します。

認証

認証スキームは、Startup.ConfigureServicesで登録した認証サービスによって指定されます。
その方法は、services.AddAuthentication を呼び出した後に、スキーム固有の拡張メソッド (AddJwtBearer や AddCookie など) を呼び出すことです。これらの拡張メソッドは、AuthenticationBuilder を使用して、適切な設定でスキームを登録します。

Cookie JwtBearer認証スキームの追加

command[zccheck_disk]=/usr/local/nagios/libexec/zccheck_disk.pl -w 90 -c 95

JwtBearer認証の設定パラメータ class JwtConfig

#yum install sysstat

appsettings.jsonの設定パラメータ

/etc/init.d/sysstat start

認証ミドルウェアの追加

アプリケーションのIApplicationBuilderでUseAuthentication拡張メソッドを呼び出すことで、Startup.Configureに認証ミドルウェアを追加します。UseAuthentication を呼び出すと、先に登録した認証スキームを使用する中間セクションが登録されます。UseAuthenticationは、認証されるユーザーに依存する全てのミドルウェアの前に呼び出してください。エンドポイントルーティングを使用している場合、以下の順序でUseAuthenticationを呼び出す必要があります。

  • ルーティング情報を認証の決定に使用できるように、UseRoutingの後に呼び出される。
  • {を使用します。 UseEndpointsの前に呼び出され、ユーザーは認証された後でのみエンドポイントにアクセスできるようになります。
{コード

クッキー認証

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }
    app.UseHttpsRedirection();
    app.UseSession();
    app.UseRouting();

    //Enable authentication middleware
    app.UseAuthentication();
    //Enable authorization middleware
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {

        endpoints.MapControllerRoute(
        name: "areas",
        pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

jwt認証

[HttpPost]
public async Task<NewtonsoftJsonResult> LoginIn(string userName, string userPassword, string code)
{
    AjaxResult objAjaxResult = new AjaxResult();
    var user = _userBll.GetUser(userName, userPassword);
    if (user == null)
    {
        objAjaxResult.Result = DoResult.NoAuthorization;
        objAjaxResult.PromptMsg = "Username or password error";
    }
    else
    {
        var claims = new List<Claim>
        {   
            new Claim("userName", userName),
            new Claim("userID",user.Id.ToString()),
        };
        await HttpContext.SignInAsync(new ClaimsPrincipal(new ClaimsIdentity(claims,CookieAuthenticationDefaults.AuthenticationScheme)));
        objAjaxResult.Result = DoResult.Success;
        objAjaxResult.PromptMsg = "Login successful";
    }
    return new NewtonsoftJsonResult(objAjaxResult);
}

オーソライズ

認可時に、アプリケーションは使用するハンドラを指定します。アプリケーションが認証スキームのカンマ区切りリストを介して着信認証に渡すハンドラ[Authorize]を選択します。Authorize] 属性は、デフォルトが設定されているかどうかにかかわらず、使用する認証スキーム (複数可) を指定します。

デフォルトの認証

上記の認証設定において、デフォルトの構成としてクッキーを使用しているため、フロントエンドの対応するコントローラは認証スキームを指定する必要がなく、[Authorize]と入力すればよいことになります。

オーソライズを選択

APIインターフェースにはJwt認証を使用し、Controllerに指定されたスキームを入力します。

[HttpPost]
public NewtonsoftJsonResult Token([FromBody] UserInfo model)
{
    AjaxResult objAjaxResult = new AjaxResult();
    var user = _userBll.GetUser(model.UserName, model.Password);
    if (user == null)
    {
        objAjaxResult.Result = DoResult.NoAuthorization;
        objAjaxResult.PromptMsg = "Username or password error";
    }
    else
    {
        //jwtTokenOptions is configured to get information about the parameters configured above
        var jwtTokenOptions = BaseConfigModel.jwtConfig;
        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtTokenOptions.SigningKey));
        var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
        //identity
        var claims = new List<Claim>
            {
                new Claim("userID",user.Id.ToString()),
                new Claim("userName",user.UserName),
            };
        //Token
        var expires = DateTime.Now.AddMinutes(jwtTokenOptions.Expires);
        var token = new JwtSecurityToken(
            issuer: jwtTokenOptions,
            Audience: jwtTokenOptions,
            Audience, claims: claims,
            notBefore: DateTime,
            Now, expires: expires,
            signingCredentials: credentials
            );
        string jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
        objAjaxResult.Result = DoResult.Success;
        objAjaxResult.RetValue = new
        {
            token = jwtToken
        };
        objAjaxResult.PromptMsg = "Login successful";
    }
    return new NewtonsoftJsonResult(objAjaxResult);
}


画像

概要

複数の番組が混在する場合の認証プロセスについて。
1. 認証スキームを設定する(関連する設定パラメータは、設定ファイルの形式でもよい)。
2、認可検証ミドルウェアを追加する。
3、認証インターフェースを提供する。
4. 4. 認証が必要なインターフェイスの認証スキームを設定します。

この記事はasp.net core3.1クッキーとjwtのハイブリッド認証の認可で、様々な認証方式を実現するために導入され、より関連するasp.net coreクッキーとjwt認証の認可内容は、スクリプトホーム以前の記事を検索するか、次の関連記事を閲覧し続けてくださいあなたはスクリプトホームをよりサポートしてくれることを願っています!...