3

私は秘密鍵(APIキー)認証asp.netコアWeb APIを使用したいと思います。下記のように鍵がカスタム認証asp.netコアweb api

ex. Authorization keytype;h43484344343bbhfdjfdfhj34343 

は、私がリクエストヘッダからこのキーを読み取って、鍵を検証するために内部APIを呼び出すためのミドルウェアを書きたい、Authorizationヘッダーに渡されます。

web apiでは、これを行うメッセージハンドラを作成できますが、私はasp.net coreを初めて使用しています。私はたくさんのサンプルを見ていますが、彼らは組み込みのJWTトークン認証を使用しています。しかし私は私自身の鍵を使いたいと思っていました。私はこの鍵を解読し、データベースエントリに対して検証します。

誰もこの方法を行うためのいくつかのコードサンプルを提案できますか?

+0

どのaspコアのバージョンを使用していますか? – peco

+0

.net core 1.1は私のターゲットフレームワークです – blue

答えて

4

私はこのアプローチをasp core 1.1を使用するソリューションで使用しました。まず、カスタムスキームを定義します。

public static class Authentication 
{ 
    public const string Scheme = "Custom"; 
} 

あなたはその後、AuthenticationHandler<TOptions>を継承しなければなりません。ヘッダ値を検証するためのロジックが行くのはここです:

public class MyAuthenticationHandler : AuthenticationHandler<MyOptions> 
{ 
    protected override Task<AuthenticateResult> HandleAuthenticateAsync() 
    { 
     var authorizationHeader = Context.Request.Headers["Authorization"]; 
     if (!authorizationHeader.Any()) 
      return Task.FromResult(AuthenticateResult.Skip()); 

     var value = authorizationHeader.ToString(); 
     if (string.IsNullOrWhiteSpace(value)) 
      return Task.FromResult(AuthenticateResult.Skip()); 

     // place logic here to validate the header value (decrypt, call db etc) 

     var claims = new[] 
     { 
      new Claim(System.Security.Claims.ClaimTypes.Name, "Bob") 
     }; 

     // create a new claims identity and return an AuthenticationTicket 
     // with the correct scheme 
     var claimsIdentity = new ClaimsIdentity(claims, Authentication.Scheme); 

     var ticket = new AuthenticationTicket(new ClaimsPrincipal(claimsIdentity), new AuthenticationProperties(), Authentication.Scheme); 

     return Task.FromResult(AuthenticateResult.Success(ticket)); 
    } 
} 

AuthenticationHandlerを継承するためには、あなたが使用しているスキームにAuthenticationScheme -propertyを設定するオプションクラスを作成する必要があります。

public class MyOptions : AuthenticationOptions 
{ 
    AuthenticationScheme = Authentication.Scheme; 
} 

これ以降、継承する必要がありますAuthenticationMiddleware<TOptions>。簡単にあなたがこれらの拡張メソッドを定義することができ、あなたのミドルウェアをプラグインするためには

public class MyAuthenticationMiddleware : AuthenticationMiddleware<MyOptions> 
{ 
    public MyAuthenticationMiddleware(RequestDelegate next, IOptions<MyOptions> options, ILoggerFactory loggerFactory, UrlEncoder encoder) : base(next, options, loggerFactory, encoder) 
    { 
    } 

    protected override AuthenticationHandler<MyOptions> CreateHandler() 
    { 
     return new MyAuthenticationHandler(); 
    } 
} 

:これは、前の手順で実装ハンドラを作成します

public static IApplicationBuilder UseMyAuthentication(this IApplicationBuilder app, IConfigurationSection config) 
{ 
    return app.UseMyAuthentication(options => {}); 
} 

private static IApplicationBuilder UseMyAuthentication(this IApplicationBuilder app, Action<MyOptions> configure) 
{ 
    var options = new MyOptions(); 
    configure?.Invoke(options); 

    return app.UseMiddleware<MyAuthenticationMiddleware>(new OptionsWrapper<MyOptions>(options)); 
} 

次に、あなたのStartupクラスであなたが最終的に追加することができますあなたのミドルウェア:

public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
{ 
    app.UseMyAuthentication(Configuration.GetSection("MyAuthenticationOptions")); 

    // other stuff 

    app.UseMvc(); 
} 

次に、作成したばかりのスキームを指定して、あなたの行動にAuthorizeAttributeを追加します。

[Authorize(ActiveAuthenticationSchemes = Authentication.Scheme)] 
public IActionResult Get() 
{ 
    // stuff ... 
} 

多くの手順がありますが、うまくいけばこれはあなたに行くでしょう!

+0

GitHubなどのどこかにコード全体がありますか? – blue

+0

ホールド、私はサンプルを入れます – peco

+2

https://github.com/pellec/AspCoreCustomAuthenticationDemo – peco