12

Asp.Net Identity 2 で Web Api 2.1 を使用しています。ApiController のコンストラクターで認証済みのユーザーを取得しようとしています (依存関係を注入するために AutoFac を使用しています)が、コンストラクターが呼び出されたときにユーザーが認証されていないと表示されます。

DB書き込み操作の監査情報を生成できるように、ユーザーを取得しようとしています。

診断に役立ついくつかのことを実行してい ます。Asp.Net Identity 2 での認証としてのみ
使用しています。これは、Asp で新しい Web Api 2.1 プロジェクトを作成するときに、デフォルトで有効になっている を削除したことを意味します。 .Net ID 2。 app.UseOAuthBearerTokensapp.UseCookieAuthentication(new CookieAuthenticationOptions())

内部WebApiConfigでは、リポジトリを注入しています:

builder.RegisterType<ValueRepository>().As<IValueRepository>().InstancePerRequest();

これが私のコントローラーです:

[RoutePrefix("api/values")]
public class ValuesController : ApiController
{
    private IValueRepository valueRepository;

    public ValuesController(IValueRepository repo)
    {
        valueRepository = repo;
        // I would need the User information here to pass it to my repository
        // something like this:
        valueRepository.SetUser(User);
    }

    protected override void Initialize(System.Web.Http.Controllers.HttpControllerContext controllerContext)
    {
        base.Initialize(controllerContext);

        // User is not avaliable here either...
    }
}

しかし、コンストラクターで User オブジェクトを調べると、次のようになります。 ユーザー

認証は機能しています。トークンを渡さないと、Unauthorized. トークンを渡して、いずれかのメソッドからユーザーにアクセスしようとすると、認証され、正しく入力されます。呼び出されたときにコンストラクターに表示されないだけです。

私のWebApiConfig中で私は使用しています:

public static void Register(HttpConfiguration config)
{
    config.SuppressDefaultHostAuthentication();
    config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

    // Web API routes
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

     // ... other unrelated injections using AutoFac
 } 

config.SuppressDefaultHostAuthentication()この行を削除すると、コンストラクターにユーザーが入力されることに気付きました。

これは期待されていますか?コンストラクターで認証されたユーザーを取得するにはどうすればよいですか?

編集: Rikard が提案したように、Initialize メソッドでユーザーを取得しようとしましたが、まだ利用できず、画像で説明されているのと同じ結果が得られます。

4

6 に答える 6

3

コントローラーの User プロパティは、コンストラクターが呼び出された後に発生する Initialize メソッドが呼び出されるまで設定されません。

于 2014-05-22T16:45:07.593 に答える
1

Thread.CurrentPrincipicalはパイプライン全体で使用できます。以下のユーザー登録をスキップできます。

valueRepository.SetUser(User);

アクセス

Thread.CurrentPrincipical

代わりにリポジトリで、リポジトリのコンテキストを認識させます。さらに、コンテキスト レイヤーを追加できます。

于 2016-02-12T08:56:54.923 に答える
0

上記の解決策のいずれも機能しない場合は、次の方法を試してください。

    public ActionResult GetFiles()
    {
        ...
        string domainID = System.Web.HttpContext.Current.Request.LogonUserIdentity.Name;
        ...
    }
于 2017-09-28T17:12:45.570 に答える