2017-12-21 37 views
3

私は立ち往生しています。Azure AD B2Cに対してOWIN/OIDCを使用してカスタムUmbracoコントローラを認証する

私はRenderMvcControllerを継承するカスタムUmbracoコントローラを持っていますが、Index()アクションメソッドがヒットした場合、ファイルが返されます。これはうまくいきますが、私がしたいのは、アクションをAuthorizeAttributeで修飾し、ユーザーに認証を要求することで保護することです。

namespace MyNamespace.Controllers 
{ 
    public class MyModelController : RenderMvcController 
    { 
     [Authorize] 
     public ActionResult Index(RenderModel model) 
     { 
      // ... 
     } 
    } 
} 

認証は、Azure AD B2Cアプリケーションに対してOWINとOpenId Connectを使用して行われます。これもうまく動作し、テストされますが、Umbraco以外のコンテキストではテストされます。

私は主題に関連した多数のスレッドとコードを読んでいますが、私はUmbraco内に統合するのに苦労しています。私はUmbracoDefaultOwinStartupから継承するカスタム起動クラスを持っています。 AuthControllerへのカスタムルートを登録し、IAppBuilder.UseOpenIdConnectAuthentication()でOIDCを設定します。

しかし、私はウンブラの接着剤が必要で、どのようにしてクッキーを設定すべきかを理解する上で問題があります。スタートアップのConfiguration()メソッドが呼び出されたことを確認しました。

namespace MyNamespace 
{ 
    public class CustomOwinStartup : UmbracoDefaultOwinStartup 
    { 
     public override void Configuration(IAppBuilder app) 
     { 
      base.Configuration(app); 
      ConfigureAuth(app); 

      RouteTable.Routes.MapRoute(
       "CustomAuth", 
       "CustomAuth/{action}", 
       new { controller = "Auth" } 
      ); 
     } 

     private void ConfigureAuth(IAppBuilder app) 
     { 
      app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 
      app.UseCookieAuthentication(new CookieAuthenticationOptions 
      { 
       AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
       LoginPath = new PathString("/CustomAuth/SignUpSignIn") // TODO: What should I put here? 
      }); 
      app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 
      app.UseOpenIdConnectAuthentication(
       // Passing options that are tested and working 
      ); 
     } 
    } 
} 

次に、当面は非常に簡単な認証コントローラがあります。 Umbracoユーザーと認証情報を同期する必要はありません。

namespace MyNamespace.Controllers 
{ 
    public partial class CustomAuthController : Controller 
    { 
     public CustomAuthController() : base() 
     { 
     } 

     public void SignUpSignIn() 
     { 
      if (!Request.IsAuthenticated) 
      { 
       HttpContext.GetOwinContext().Authentication.Challenge(); 
       return; 
      } 

      Response.Redirect("/"); // TODO: Maybe this should redirect me back to original route MyModel/Index in some way 
     } 
    } 
} 

私はこれを実行すると、私の属性装飾カスタムUmbracoコントローラを介してにしようと、私はこのエラーを取得する:

Page not found

No umbraco document matches the url '/login.aspx?ReturnUrl=MYORIGINALROUTEHTTPENCODED' . This page can be replaced with a custom 404. Check the documentation for "custom 404".

私の推測では、これが原因Web.config<authentication mode="Forms">設定であることですが、あれば私はこれを削除するか、属性mode"None"に設定しましたが、これはバックオフィスのログインには影響しませんか?

誰かが私を正しい方向に向けるのを手伝ってもらえると非常に感謝しています!

+0

[このサンプルアプリケーション](https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-and-webapi/blob/master/TaskWebApp/App_Start/)を確認しましたか? Startup.Auth.cs)はowin w/b2cを使用していますか? – spottedmahn

+1

はい、私はそれをOIDCコンフィギュレータに渡しているオプションオブジェクトの基礎としています。 – Viktor

+0

詳しくは、サンプルアプリケーションを使用して作業するようにしましたが、今のまま残しておきたい既存のUmbracoアプリケーションに同じ認証レイヤーを追加したいと思います。 Umbracoのフロントエンドユーザーストアに接続するための私のカスタム認証は必要ありません。私はauth-then-forgetをしたいからです。または、auth-then-maybe-logを入力します。残りのサイトは公開されています。 – Viktor

答えて

2

残念ながら、私は同じ環境を設定してすべてをチェックするのに十分な時間がありませんが、私はいくつかの考えを与え、いくつかのリンクを投稿します。

バックオフィスログインロジックを無効にするには、カスタム認証コントローラを作成するか、ログインページを上書きする必要はありません。 Umbracoは認証にASP.NET IDを使用するため、OWINの起動時に適切に設定する必要があり、必要に応じて動作します。次に、Umbraco認可ツールを使用して、ユーザーがMyModelControllerのIndexアクションを押すことができるかどうかを確認します。

カスタムユーザー名/パスワードチェックを実装する必要がある場合は、Umbraco拡張機能を使用してください。詳細:https://our.umbraco.org/documentation/Reference/Security/#replacing-the-basic-username-password-check

また、Active DirectoryにUmbraco拡張機能を使用することもできます。もっと見る:https://our.umbraco.org/documentation/Reference/Security/#authenticating-with-active-directory-credentials

そしてAuthorizeAttributeについて。あなたはが見つかりません。エラーの原因は、OWINとUmbracoについて何も知らない。これは、login.aspxページのデフォルトパスにリダイレクトされ、プロジェクトには存在しません。 <authentication mode="Forms">Noneに設定することができます。 Umbracoのバックオフィスに影響を与えることはありません。原因はASP.NET IDを使用するためです。いくつかのリソースを保護したい場合は、UmbracoAuthorizeAttributeを使用できます。

もっと見る:https://our.umbraco.org/documentation/Implementation/Controllers/#mvc

はとにかく多くのUmbracoチュートリアルやドキュメントをお読みください。私はあなたが答えを見つけることを願っています。もっとお気軽にお問い合わせください。

を更新しました

はAuthorizeAttributeの独自のバージョンを使用してみてください。例があります:http://www.c-sharpcorner.com/UploadFile/56fb14/custom-authorization-in-mvc/

AuthorizeCoreメソッドをオーバーライドし、HandleUnauthorizedRequestから必要な結果を返す必要があります。 RedirectResultをログインページや必要なものに戻すことができます。

カスタムAuthorizeAttributeが解決しないか、それはあなたがあなたのActionFilterを作成し、そこに承認ロジックを置くことができる動作しない場合は2

を更新しました

[CustomAuthorize] 
    public ActionResult Index(RenderModel model) 
    { 
     // ... 
    } 

として、それを適用することができます。もちろんベストプラクティスではありませんが、少なくともそれをやろうとすることはできます。参照:https://msdn.microsoft.com/en-us/library/gg416513(vs.98).aspx#Anchor_2

+0

バックオフィスのログインを無効にする必要はありません。簡単に言えば、ユーザーが特定のドキュメントタイプにアクセスしようとしたときに、そのユーザーを認証したいと思う。ユーザーが自分のアイデンティティプロバイダに登録されていることを知りたいだけです。私は 'MemberAuthorizeAttribute'でドキュメントタイプコントローラを保護しようとしましたが、これは"このタイプのページは提供されていません "というエラーをレンダリングします。しかし、私はOAuthプロバイダを 'HttpContext.GetOwinContext()。Authentication.Challenge()'で呼び出すことができます。リクエストが認証されていないときに 'MemberAuthorizeAttribute'が何をするのか何らかの方法でオーバーライドできますか? – Viktor

+0

残念ながら、MemberAuthorizeAttributeを使用して、ユーザーが権限を持っているかどうかを確認することはできません。あなたが望むなら、こちらをもっと読むことができます:https://our.umbraco.org/forum/developers/api-questions/53816-MemberAuthorize-Redirection#comment-186685。 私はあなたのニーズを理解して、あなたの質問についてもっと見てみることにします。 – Iaroslav

+0

独自のカスタムAuthorizeAttributeを作成しようとしましたか?私はそれが動作するはずだと思います。以前の私のプロジェクトの1つでそのアプローチを見ました。私たちはWeb APIのためにそれを持っていましたが、MVCの場合はほとんど同じです。 ここ:http://www.c-sharpcorner。com/UploadFile/56fb14/custom-authorization-in-mvc/ あなたはOWINコンテキストを介して、また必要に応じてログインページや必要なものにリダイレクトすることができます。 助けてくれればもっと詳しく説明してください。 – Iaroslav

関連する問題