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;
}
Service Frameworkは、すべてのルートを{unique portal path} / DesktopModules / {ModuleName} / API/{url}の形式に強制します。一意のポータルパスは、リクエストの送信先のポータルを簡単に識別するために重要です。ほとんどの場合、DNNは/Default.aspx?portalid=nの形式のURLを許可しますが、Service Frameworkはそれを受け入れません。要求パスがポータルエイリアスと一致する必要があります(例:mysite.com/childportal/...)。要件は、GetDomainName()が機能することを保証します。
TestableXXXクラスは内部名前空間にあるため、公式のパブリックAPIの一部ではなく、リリース間で重大な変更が行われる可能性があることに注意してください。クラスのほとんどのメソッドには、モックするのが難しいパブリックアナログがありますが、それ以外は同等です。サーバーをアップグレードする前に小さなコード修正を行うことが合理的である場合は、Testablesを自由に使用してください。サーバーのアップグレードを完全に制御できない場合は、.Internal名前空間を避ける必要があります。
Service Frameworkは、特定のモジュールインスタンスの権限に対する認証をサポートしています。モジュールに関連付けられているサービスは、プロバイダータブとモジュールIDである必要があります。サービスがモジュール固有でない場合は、これを省略して、PortalSettingsで-1のタブIDを使用できます。
ServiceFrameworkには、MVCが提供していないため、基本認証とダイジェスト認証の独自の実装があります。ServiceStackはBasicとDigestを提供していると思います。そのため、おそらくMembershipModule.AuthenticateRequest()を呼び出すだけで済みます。