イーサー坊ブロックチェーンでAspを保証する.Net CoreのAPIセキュリティ(上)


デセンタアプリケーション(DApp)の一般的な設計は、イーサ坊ブロックチェーンだけでなく、APIレイヤにも依存する.この場合、DAppは、ユーザのイーサ坊アカウントを介してスマート契約と対話し、ユーザ認証情報を交換することによって発行されるJWT tokenを介してAPIレイヤと対話する.
ターゲットは、ユーザー認証情報としてEthernetアカウントを使用してJWT Tokenを要求することです.
最も簡単な方法は、ユーザに他のランダムに生成されたデータを使用してイーサ坊で取引を行うように要求し、JWTを発行する前に取引とランダムデータをチェックすることである.この方法にはいくつかの副作用があります.
  • 1.ユーザーは、簡単な認証のためにgasを取引し、支払う必要があります.
  • 2.認証プロセスを完了するには、ユーザーは12~120秒(消費されたgasに基づいて)待たなければなりません.
  • 3.各ユーザのすべてのログイン操作は、イーサー坊ブロックチェーン上で公開できなくなる.

  • この方法は実用的ではなく、いくつかのユーザー体験の制限があり、取引を行うかどうかにかかわらず、ユーザーがログインしたいアカウントに関連する秘密鍵を持っていることを証明する方法が必要です.
    ソリューション
    MetamaskチームメンバーのDan Finlayのこの文章は私にこのチュートリアルを啓発しました.基本的に、あなたのDAppはユーザーに彼の秘密鍵を使ってメールに署名するように促すことができます.この署名操作では取引は生成されません.さらに、Metamaskの追加コンポーネントによって透過的に処理されます(ちなみに、アカウントはロック解除する必要があります).署名後、アカウント、メッセージ、署名がAPI Token endpointに送信されます.検証方法は、まず、入力された関数として署名と明文メッセージを受け入れることによって、署名からアカウントをプッシュします.(公開鍵とも呼ばれます).計算されたEthernetアドレスがユーザーによって提供されたアカウントと等しい場合、JWT Tokenが発行されます.
    認証プロセス全体でユーザー名/パスワードまたはOAuth外部サービスは不要であることに注意してください.ユーザのアイデンティティを検証するためのメカニズムは、イーサ坊がイーサ坊ブロックチェーンの安全性を保証するために使用するメカニズムと同じである.これは、Go ethereum(Geth)がMetamaskプラグインを介してJSON RPCのweb3.personal.signを提供したことに起因する.
    サーバ側は、対応するJSON RPCを呼び出して、署名からアカウント:web3.personal.ecrecoverを取得する.このチュートリアルでは、Aspを構築します.Net Core 2プロジェクトはAPIレイヤとして、この認証プロセスを実際に実証するために、簡単なHTML/javascriptクライアントをDAppとして構築します.
  • 1.DAppユーザーからログインボタンをクリックします.これにはMetamaskが提供するweb 3オブジェクトが必要です.
  • 2.Metamaskは、JSON RPCのweb3.personal.signを介してメッセージに署名するようにユーザに要求する.
  • 3.署名は、JSON RPCのweb3.personal.ecrecoverを介してアカウントを検証するAPIレイヤに送信されます.
  • 4.検証後、APIレイヤはJWTをパブリッシュします.

  • 前提条件
  • 1.ChromeまたはFirefoxにMetamaskプラグインをインストールします.この追加コンポーネントは「エーテル坊をブラウザに連れて行きます」です.実際、Metamaskは、DAppのイーサ坊ブロックチェーンとインタラクティブになり、秘密鍵を処理し、ブラウザで取引を管理するためのweb 3オブジェクトを提供しています.
  • 2.オプション.Gethノードを実行します.署名からEthernetアカウントを復元する2つの方法を示します.1つの方法は、Gethノードに対してAPIレイヤがJSON RPCを呼び出す必要があります.注意:Infuraは、ほとんどのweb3.personal.*のJSON RPCインタフェースを許可しないため、まだできません.開発目的でGethノードを実行するのは簡単です.本番環境では、Gethノードを安全性の観点から実行することは簡単なタスクではありません.最良の方法は、AWSまたはAzureによって提供されるブロックチェーン、すなわちサービススタック(BaaS).
  • 3.開発スタック:Visual Studio 2017とノードパッケージマネージャ(NPM).
  • 4.エーテル坊/ASP.Netコア/フロントエンド開発の基礎知識、JWT認証プロセスの基礎知識.

  • スタート
    Visual Studio 2017を開き、EthereumJwtSolutionを作成し、2つのAspを追加する.Net Core 2 Webアプリケーションプロジェクト:EthereumJwtApiおよびEthereumJwtClient.2つのプロジェクトに対して空のプロジェクト足場を選択します.EthereumJwtClientは、HTML/Javascriptクライアントにすぎません.私たちはAspにいます.Net Core上でクライアントアプリケーションを構築するのは、IIS Express上で簡単に実行するためだけです.
    いくつかのセキュリティ・エンド・ポイントを保護するために、JWT tokenを作成および処理するためにEthereumJwtApiを準備する必要があります.任務は簡単だNet Core 2には、アプリケーションを挿入できるJWTメカニズムが組み込まれています.スタートを切るcs ConfigureServicesメソッドを変更します.
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidateAudience = true,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                ValidIssuer = Configuration["Jwt:Issuer"],
                ValidAudience = Configuration["Jwt:Audience"],
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
            };
        });
    
        services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                builder => builder.AllowAnyOrigin()
                  .AllowAnyMethod()
                  .AllowAnyHeader()
                  .AllowCredentials()
            .Build());
        });
    
        services.AddMvc();

    次に、Configureメソッドを変更します.
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    
    app.UseCors("CorsPolicy");
    
    app.UseAuthentication();
    
    app.UseMvc();

    APIアプリケーションがJWT認証サービスを使用していることを示します.デルのユーザーと協力するためには、Corsポリシーを構成する必要があります.appsetting.jsonでJWT構成の設定を定義します.
    "Jwt": {
        "Key": "averysecretpassphrase", // A random and secure passhphrase
        "Issuer": "http://localhost:49443/", // This API base URI
        "Audience": "http://localhost:51149/" // The client base URI
      },

    テストの目的のために簡単な安全なエンドポイントを作成します.
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        // GET api/values
        [HttpGet, Authorize]
        public IEnumerable Get()
        {
            return new string[] { "Secret 1", "Secret 2" };
        }
    }
    TokenController.csは、JWT要求および関連するtoken問題を処理する.
    [Route("api/[controller]")]
    public class TokenController : Controller
    {
        private IConfiguration _config;
    
        public TokenController(IConfiguration config)
        {
            _config = config;
        }
    
        [AllowAnonymous]
        [HttpPost]
        public async Task CreateToken([FromBody]LoginVM login)
        {
            var user = await Authenticate(login);
    
            if (user != null)
            {
                var tokenString = BuildToken(user);
                return Ok(new { token = tokenString });
            }
    
            return Unauthorized();
        }
    
        private string BuildToken(UserVM user)
        {
            var claims = new[] {
                new Claim(JwtRegisteredClaimNames.Sub, user.Account),
                new Claim(JwtRegisteredClaimNames.GivenName, user.Name),
                new Claim(JwtRegisteredClaimNames.Email, user.Email),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
            };
    
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    
            var token = new JwtSecurityToken(_config["Jwt:Issuer"],
              _config["Jwt:Audience"],
              claims,
              expires: DateTime.Now.AddMinutes(30),
              signingCredentials: creds);
    
            return new JwtSecurityTokenHandler().WriteToken(token);
        }
    
        private async Task Authenticate(LoginVM login)
        {
            // TODO: this method will authenticate the user recovering the Ethereum address from signature using the Geth RPC web3.personal.ecrecover API
    
            UserVM user = user = new UserVM { Account = login.Account, Name = string.Empty, Email = string.Empty };
    
            return user;
        }
    
        private async Task Authenticate2(LoginVM login)
        {
            // TODO: This method will authenticate the user recovering his Ethereum address through underlaying offline ecrecover method.
            
            UserVM user = user = new UserVM { Account = login.Account, Name = string.Empty, Email = string.Empty };
    
            return user;
        }

    これは典型的なJWTコントローラであり、コアメソッド、AuthenticateおよびAuthenticate2はまだ実装されていない.実装されると、署名からEthernetアドレスを復元し、クライアントが提供するEthernetアドレスと等しいかどうかを確認します.LoginVMはクライアントから提供されたユーザ認証情報を表し、UserVMは「サーバ側」ログインユーザを表す.
    public class LoginVM
    {
        public string Signer { get; set; } // Ethereum account that claim the signature
        public string Signature { get; set; } // The signature
        public string Message { get; set; } // The plain message
        public string Hash { get; set; } // The prefixed and sha3 hashed message 
    }
    
    public class UserVM
    {
        public string Account { get; set; } // Unique account name (the Ethereum account)
        public string Name { get; set; } // The user name
        public string Email { get; set; } // The user Email
    }
    AuthenticateメソッドはSignatureおよびMessage属性をecRecover関数の入力とし、Authenticate2メソッドはSignatureおよびHash属性を使用する.その違いを後で説明します.
    ======================================================================
    イーサー坊、EOS、ビットコインなどのブロックチェーンに関するインタラクティブなオンラインプログラミング実戦チュートリアルを共有します.
  • javaイーサ坊開発チュートリアルは、主にjavaとandroidプログラマーに対してブロックチェーンイーサ坊開発を行うweb 3 jの詳細です.
  • pythonイーサー坊は、主にpythonエンジニアに対してweb 3を使用する.pyはブロックチェーンエーテル坊開発の詳細を行う.
  • php以太坊は、主にphpを使用してスマート契約開発のインタラクションを行い、アカウントの作成、取引、振替、コイン開発、フィルタと取引などを行う内容を紹介しています.
  • 以太坊入門チュートリアルは、主にスマート契約とdapp応用開発を紹介し、入門に適している.
  • 以太坊開発進級教程、主にnodeの使用を紹介する.js、mongodb、ブロックチェーン、ipfsは中心化された電子商取引DApp実戦を実現し、進級に適している.
  • C#イーサー坊は、主にC#開発ベースの使用方法を説明する.Netのイーサー坊アプリケーションには、アカウント管理、ステータスと取引、スマート契約開発とインタラクション、フィルタと取引などが含まれています.
  • EOS教程、この課程はあなたが急速にEOSブロックチェーンの中心化応用の開発に入ることを助けて、内容はEOSツールチェーン、口座と財布、発行コイン、知能契約の開発と配置、コードと知能契約の相互作用などの核心知識点をカバーして、最後に各知識点を総合的に運用して1つの便箋DAppの開発を完成します.
  • javaビットコイン開発チュートリアル、このコースは初心者向けで、内容はビットコインの核心概念をカバーしています.例えば、ブロックチェーンストレージ、センター化共通認識メカニズム、鍵とスクリプト、取引とUTXOなどです.同時に、Javaコードにビットコインサポート機能を統合する方法を詳しく説明します.例えば、アドレスの作成、財布の管理、裸取引の構築などです.Javaエンジニアでは得られないビットコイン開発学習コースです.
  • phpビットコイン開発教程、この課程は初心者向けで、内容はビットコインの核心概念をカバーして、例えばブロックチェーンの記憶、中心化の共通認識のメカニズム、鍵とスクリプト、取引とUTXOなど、同時にPhpコードの中でビットコインの支持機能を集積する方法を詳しく説明して、例えば住所の作成、財布の管理、裸の取引の構造など、Phpエンジニアでは得られないビットコイン開発学習コースです.

  • 原文はここで太坊区ブロックチェーンAsp.Net Core API