19

質問基本認証

どのように私はASP.NETコアWebアプリケーションでカスタムメンバーシップに基本認証を実装することができますか?

ノートMVC 5において

  • IはWebConfigにモジュールを追加する必要このarticleの手順を用いました。

  • 私はまだ新しいMVC CoreアプリケーションをIISに配備していますが、この方法は機能していないようです。

  • また、Windows認証情報を使用しているため、基本認証のIISサポートを使用したくない場合もあります。

+4

なぜdownvote。良い質問!私は0にあなたをアップフォートした。私ができることすべて。 – Coaden

答えて

15

ASP.NETセキュリティには、潜在的なセキュリティとパフォーマンスの問題があるため、基本認証ミドルウェアは含まれません。

あなたはテスト目的のために基本認証ミドルウェアが必要な場合は、https://github.com/blowdart/idunno.Authentication

+2

互換性の問題があるため、職場のプロジェクトで[kukkimonsuta](https://github.com/Kukkimonsuta/)の[Odachi](https://github.com/Kukkimonsuta/Odachi)ライブラリを使用しました"私たちが必要としていたことはうまくいった。 –

+0

@blowdart @Matt Ridgway、私は私のウェブサイトで働いている「小町」図書館を手に入れました。ウェブサイトのすべてのURLに対してこの基本認証を実行するように設定するにはどうすればよいですか?私は公衆から私のウェブサイトを保護する必要がありますように。今すぐ 'App.Map("/test "、Run_Simple)'を使って_Startup.cs_で定義する特定のURLに対してのみ動作します。 –

+0

@AliSharabiani - あなたのパイプラインで何か変わったことをしているように聞こえるので、GitHubのレポにリンクすることができますか? –

3

を見てください私たちは、のActionFilterを使って、内部サービスのためのダイジェストセキュリティを実装:その後、あなたがコントローラに注釈を付けることができます

public class DigestAuthenticationFilterAttribute : ActionFilterAttribute 
{ 
    private const string AUTH_HEADER_NAME = "Authorization"; 
    private const string AUTH_METHOD_NAME = "Digest "; 
    private AuthenticationSettings _settings; 

    public DigestAuthenticationFilterAttribute(IOptions<AuthenticationSettings> settings) 
    { 
     _settings = settings.Value; 
    } 

    public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     ValidateSecureChannel(context?.HttpContext?.Request); 
     ValidateAuthenticationHeaders(context?.HttpContext?.Request); 
     base.OnActionExecuting(context); 
    } 

    private void ValidateSecureChannel(HttpRequest request) 
    { 
     if (_settings.RequireSSL && !request.IsHttps) 
     { 
      throw new AuthenticationException("This service must be called using HTTPS"); 
     } 
    } 

    private void ValidateAuthenticationHeaders(HttpRequest request) 
    { 
     string authHeader = GetRequestAuthorizationHeaderValue(request); 
     string digest = (authHeader != null && authHeader.StartsWith(AUTH_METHOD_NAME)) ? authHeader.Substring(AUTH_METHOD_NAME.Length) : null; 
     if (string.IsNullOrEmpty(digest)) 
     { 
      throw new AuthenticationException("You must send your credentials using Authorization header"); 
     } 
     if (digest != CalculateSHA1($"{_settings.UserName}:{_settings.Password}")) 
     { 
      throw new AuthenticationException("Invalid credentials"); 
     } 

    } 

    private string GetRequestAuthorizationHeaderValue(HttpRequest request) 
    { 
     return request.Headers.Keys.Contains(AUTH_HEADER_NAME) ? request.Headers[AUTH_HEADER_NAME].First() : null; 
    } 

    public static string CalculateSHA1(string text) 
    { 
     var sha1 = System.Security.Cryptography.SHA1.Create(); 
     var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(text)); 
     return Convert.ToBase64String(hash); 
    } 
} 

かあなたがダイジェストセキュリティとアクセスできるようにしたい方法:

[Route("api/xxxx")] 
[ServiceFilter(typeof(DigestAuthenticationFilterAttribute))] 
public class MyController : Controller 
{ 
    [HttpGet] 
    public string Get() 
    { 
     return "HELLO"; 
    } 

} 

基本的なセキュリティを実装するには、SiはDigestAuthenticationFilterAttributeを変更してSHA1を使用せず、AuthorizationヘッダーのBase64デコードを直接行います。

+1

参考にしてください。このアプローチの欠点は、このフィルタ(認証)が非常に遅く起こることです。認証フィルタが実行された後に実行され、認証フィルタが役に立たないことが表示されます。 –

4

ASP.NET Core 2.0では、認証と識別情報に大きな変更が加えられました。

On 1.xの認証プロバイダは、ミドルウェア(受諾された回答の実装)によって設定されました。 2.0ではサービスに基づいています。 MSドキュメント上

詳細: https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x

私はASP.NETコア2.0のための基本認証の実装を書かれ、NuGetに公開しました: https://github.com/bruno-garcia/Bazinga.AspNetCore.Authentication.Basic