2016-11-22 36 views
2

カスタムロール/メンバーシップスキーマを利用した統合認証ベースのソリューションを求めるクライアントがあります。私の元の計画は、認証を統合したクレームベースの認証メカニズムを使用することでした。しかし、私の初期の研究は、有用な情報を大量に上げているわけではありません。ADFSのないActive Directoryを使用したクレームベースの認証

私はASP.NET(コアでもowinでもない)WebAPIアプリケーションを持っています。このアプリケーションには、角度SPAベースの(asp.net)Webアプリケーションで使用されるAPIアクションがあります。私は、統合認証を使用してAPI呼び出しを許可しようとしています。私の最初の努力は、カスタムのAuthorizationAttributeとClaimsAuthenticationManagerの実装を中心にしていました。しかし、私が深く知る限り、カスタムClaimsAuthenticationManagerを使用して問題に取り掛かり始めましたが、この時点では適切なルートであるかどうかはわかりません。

あなたのために私の質問はすべてです、少なくとも、これを実現するために必要なことを私にいくつか考えてもらえますか?私は、コードの秘密ビットの助けを必要としません、ちょうど適切な "スタック"を話すように理解する必要があります。

唯一の実際の要件は、WebAPI呼び出しを許可することができます。カスタム属性を使用して承認するクレームの名前を渡しますが、Windows認証を使用していてもクレームはADにはなく、クレーム自体はデータベース。

ありがとうございました!

+1

なぜカスタムAuthorizationAttributeが必要ですか?通常は逆もあります。コントローラをデフォルトのAuthorizationAttributeで装飾し、認証手続きがプリンシパル(HttpContext.Current.UserとThread.CurrentPrincipal)を設定していることを確認します。 –

+0

参考までにhttps://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-apiも参照してください。 –

+0

@OndrejSvejdarオリジナルの考え方は、カスタム権限属性を使用して、アクションにアクセスするために要求されたクレームを装飾することでした。Windows認証を使用していますが、実際のクレーム/ロールはアクティブなディレクトリではなく別のデータベースに格納されているという難点があります。 ASP.Net WebApi2 OWINプロジェクトでこれを行うために実際に使用することが私を混乱させます。 Iveは、ミドルウェアでそれをやって、デフォルトのクラスの機能をオーバーライドすることを検討しました。私は自分の努力に集中する必要がある場所を明確にしていません。 – Brandon

答えて

2

https://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-apiを見てください。あなたは承認のためのあなたのDBを使用している認証

  • のためのADを使用している

    は、単にこれは設定することによって対処することができ入れる:

    あなたのシナリオはあまり違いはありませんWindows認証を使用するweb-apiクレームを取得し、カスタムでそれを上書き - (設定する必要があります)現在のプリンシパルを確認し、あなた自身の(すなわち、クエリデシベルで、このプリンシパルを上書きします

    <system.web> 
        <authentication mode="Windows" /> 
    </system.web> 
    

    とWeb APIのパイプラインに独自のIAuthorizationFilterを追加し、プリンシパルクレームはHttpContext.Current.UserThread.CurrentPrincipalと設定してください)。その誰もが理解し、あなたのコードをより読みやすく - 使用のデフォルト1 - How to add global ASP.Net Web Api Filters?

    public class CustomAuthenticationFilter : IAuthenticationFilter { 
        public bool AllowMultiple { get { return true; } } 
        public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) { 
        var windowsPrincipal = context.Principal as WindowsPrincipal; 
        if (windowsPrincipal != null) { 
         var name = windowsPrincipal.Identity.Name; 
         // TODO: fetch claims from db (i guess based on name) 
         var identity = new ClaimsIdentity(windowsPrincipal.Identity); 
         identity.AddClaim(new Claim("db-crazy-claim", "db-value")); 
         var claimsPrincipal = new ClaimsPrincipal(identity); 
         // here is the punchline - we're replacing original windows principal 
         // with our own claims principal 
         context.Principal = claimsPrincipal; 
        } 
    
        return Task.FromResult(0); 
        } 
    
        public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken) { 
        return Task.FromResult(0); 
        } 
    } 
    
    public static class WebApiConfig { 
        public static void Register(HttpConfiguration config) { 
        config.Filters.Add(new CustomAuthenticationFilter()); 
    
        // Web API routes 
        config.MapHttpAttributeRoutes(); 
        config.Routes.MapHttpRoute(...); 
        } 
    } 
    

    をチェックアウトするWebAPIのパイプラインにフィルタを追加する方法については もあり、カスタム認可属性は必要ありません。

  • +0

    私は遅い応答のために謝ります。私は数日間他の何かに引っ張られました。これは非常に有用な提案であり、私はそれを答えとしてマークします。私がする必要があることをやってください。しかし、この提案は最初のハードルを超えています:) – Brandon

    +0

    私はこれについてもっと考えていて、別の質問があります。だから、データを提供するWebAPIエンドポイントがあります。これは、Authorize属性が存在する場所です。しかし、許可サーバーは別のマシンです。私はopeniddictなどの認証システムを使ってJSON Webトークンを使ってユーザーを検証していますが、クライアントとwebapiサイトの両方がauthサービスと通信しています。これは似ていますか? – Brandon

    関連する問題