1

標準の WebApi アプリを OWIN に移行しようとしていますが、ID と $batch 要求に問題があります。

私は現在DelegatingHandler、でアイデンティティを検出して割り当てる を持っていますSendAsync:

// Detect bearer token and build the identity above.
IOwinContext owinContext = request.GetOwinContext();
owinContext.Authentication.User = new ClaimsPrincipal(identity);

通常のリクエストの場合、これはODataController.User. ただし、$batchリクエストでは、プロパティは認証されていない に戻りますClaimsIdentity

User なしでもをGetOwinContext返します。IOwinContextバッチ部分ごとに新しいコンテキストが作成されたと思いますが、元のコンテキストを見つける方法がわかりません。

どんな助けでも素晴らしいでしょう!

4

3 に答える 3

1

あなたのSendAsync方法で試してみてください:

request.GetRequestContext().Principal = new ClaimsPrincipal(identity);

Thread.CurrentPrincipalこれにより、 と現在の OWIN コンテキストの両方が割り当てられます (このリンクを確認してください)。100% 確実ではありませんが、OData が別のスレッドで $batch サブ要求を実行し、OWIN コンテキストが失われるため、現在のスレッドでプリンシパルが設定されていないと推測されます。

もう 1 つのオプションは、OWIN ミドルウェアから ID を割り当てることConfigurationですDelegatingHandler。これは、この回答で説明されています: https://stackoverflow.com/a/21420794/4067893、これも何らかの形で問題に関連しています。

それが役に立てば幸い。

于 2016-06-28T12:46:32.390 に答える
1

現在、私は回避策を見つけました。誰かがもっと良いものを見つけたら、それを聞きたいです。

私のDelegatingHandlerでは、ID を OwinContext 環境に保存しました。

owinContext.Set<ClaimsIdentity>("customdata:identity", principal);

AuthorizeAttribute次に、現在の ID を引き出して現在のユーザーに割り当てるカスタムを作成しました。

IOwinContext context = actionContext.Request.GetOwinContext();
owinContext.Authentication.User = context.Get<ClaimsIdentity>("customdata:identity");
actionContext.RequestContext.Principal = owinContext.Authentication.User;
于 2016-06-30T11:39:28.797 に答える
0

バッチのサブリクエストは別々のスレッドで実行され、それらのリクエストで認証プリンシパルが失われます。

でこれを試してくださいDelegatingHandler

var principal = new ClaimsPrincipal(identity);

System.Threading.Thread.CurrentPrincipal = principal;
if (System.Web.HttpContext.Current != null) {
    System.Web.HttpContext.Current.User = principal;
}

// Detect bearer token and build the identity above.
IOwinContext owinContext = request.GetOwinContext();
owinContext.Authentication.User = principal;
于 2016-06-28T12:47:22.933 に答える