2012-05-12 8 views
2

DotNetNukeの6.2DNN認証コンテキスト内でRESTサービスを提供するためにServiceStackとDotNetNukeを統合するにはどうすればよいですか?

http://www.dotnetnuke.com/Resources/Wiki/Page/DotNetNuke-6-2-Developer-Quick-Start.aspx#Services_Framework_18 似た何かをするサービスフレームワークを持っているサービスフレームワークの唯一最大の利便性は、認証、認可、およびDotNetNukeのコンテキストを確立するが、全てで構築されていることである。

DotNetNukeと認証、認可を提供し、DotNetNukeコンテキストを確立するために、ServiceStack(http://servicestack.net)をDotNetNukeと統合するにはどうすればよいですか?すべてのポインタ?

+0

DNN互換ライセンス(例えば、MITなど、GPLではなく)でServiceStack実装をリリースしたい場合は、私は非常に支援したいと思います。 – ScottS

+0

SSとDNNを統合しようとします。それがうまくいくなら、私はMITライセンスの下でリリースするでしょう。 – SoftwareWeaver

+0

DotNetNukeでサービスマンが働いたことはありますか? –

答えて

2

私はDNNの実装を書いたので、どのように動作するかについて説明します。私はServiceStackの詳細を知らないので、そこにそれをどのように適用するかは言えません。私が最初にこれを構築しようとしたとき、私はそれが実際よりもはるかに複雑であることを期待しました。実際には、コアにはほんの一握りの呼び出しが必要です。

コンテキストの確立と認証は、DnnControllerの初期化中に行われます。すべてのオープンソースであるDNNの素晴らしい点の1つは、これらすべての種類の詳細が公開されていることです。ここでDnnController.cs

そして、ここへのリンクが最も興味深いビットですされています

protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     LoadDnnContext(requestContext.HttpContext); 
     AuthenticateRequest(requestContext.HttpContext, PortalSettings.PortalId); 
    } 

    protected virtual void AuthenticateRequest(HttpContextBase context, int portalId) 
    { 
     if (!context.Request.IsAuthenticated) 
     { 
      BasicAuthenticator.Instance.TryToAuthenticate(context, portalId); 
     } 

     if (!context.Request.IsAuthenticated) 
     { 
      DigestAuthenticator.Instance.TryToAuthenticate(context, portalId); 
     } 

     MembershipModule.AuthenticateRequest(context, true /*allowUnknownExtension*/); 
    } 

    protected virtual void LoadDnnContext(HttpContextBase context) 
    { 
     var domainName = TestableGlobals.Instance.GetDomainName(context.Request); 
     var alias = TestablePortalAliasController.Instance.GetPortalAliasInfo(domainName); 

     int tabId; 
     ValidateTabAndModuleContext(context, alias.PortalID, out tabId); 

     var portalSettings = new PortalSettings(tabId, alias); 

     context.Items["PortalSettings"] = portalSettings; 
    } 

サービスフレームワークは、フォーム{ユニークなポータル・パス}/DesktopModules/{ModuleNameを}/API/{にすべてのルートを強制的にurl}固有のポータルパスは、要求が送信されたポータルを簡単に識別するために重要です。ほとんどの場合、DNNは/Default.aspx?portalid=nという形式のURLを許可しますが、Service Frameworkはこれを受け入れません。要求パスがポータルエイリアスと一致する必要があります。 mysite.com/childportal/ ...この要件は、GetDomainName()が機能することを保証します。

TestableXXXクラスは内部名前空間にあり、公式公開APIの一部ではなく、リリース間の変更を壊すことがあります。クラスのメソッドのほとんどは、模擬するのが難しいパブリックなアナログを持っていますが、そうでなければ同等です。サーバーをアップグレードする前に小規模なコード修正を行うことが合理的な場合は、Testableを自由に使用してください。サーバーのアップグレードを完全に制御できない場合は、.Internal名前空間を使用しないでください。

Service Frameworkは、特定のモジュールインスタンスのアクセス許可に対する認証をサポートしています。モジュールに結び付けられたサービスは、プロバイダタブとモジュールIDでなければなりません。サービスがモジュール固有でない場合は、これを省略して、PortalSettingsで-1のタブIDを使用します。

ServiceFrameworkは、MVCがそれらを提供しないため、独自の基本およびダイジェスト認証の実装を持っています。私はServiceStackがBasicとDigestを提供することを信じているので、おそらくMembershipModule.AuthenticateRequest()を呼び出すだけでよいでしょう。

+0

Scottに感謝します。私はあなたが提供した情報に基づいて2つを統合しようとします。これがどうやって起こるのか教えてくれます。 – SoftwareWeaver

+0

こんにちはスコット - あなたは@SoftwareWeaverのtwitterで私をDMできますか?ルーティングに関する質問があります – SoftwareWeaver

関連する問題