2017-08-09 16 views
6

私のWeb Core APIのこのコードは、認証されたユーザーだと確認していますが、ユーザー名を取得していない代わりに、アプリケーションプールの名前を取得しています。 これを修正するにはどうすればよいですか?Windowsで認証されたWeb Core APIでユーザ名を取得できないのはなぜですか?

var testa = User.Identity.GetType(); 
NLogger.Info($"testa = {testa}"); 
var testd = User.Identity.IsAuthenticated; 
NLogger.Info($"testd = {testd}"); 
var loggedInUser = User.Identity.Name; 
NLogger.Info($"loggedInUser = {loggedInUser}"); 

私のログファイルには次のものがあります。

testa = System.Security.Principal.WindowsIdentity 
testd = True 
loggedInUser = IIS APPPOOL\SIR.WEBUI 

私はコントローラの[Authorize]タグを使用しており、匿名認証は無効です。

私はPostmanのメソッドを呼び出します。正常に動作します。LoggedInUserは正しいです。しかし、私は自分のコードから呼び出すと、上記の不正なloggedInUserを取得します。 クライアントアプリケーションからWeb APIを呼び出すために使用するコードは次のとおりです。

public static async Task<IEnumerable<ContractDto>> GetAllForUser() 
{ 
    using (var client = new HttpClient(new HttpClientHandler { UseDefaultCredentials = true })) 
    { 
     client.BaseAddress = new Uri(AppSettings.ServerPathApi); 
     var path = GetPath("getallforuser"); 
     var response = await client.GetAsync(path); 
     response.EnsureSuccessStatusCode(); 
     var stringResult = await response.Content.ReadAsStringAsync(); 
     return JsonConvert.DeserializeObject<IEnumerable<ContractDto>>(stringResult); 
    } 
} 

IISでは、アプリケーションプールの種類をさまざまなオプションに設定しています。 applicationpoolidentity、networkservice、localservice、localsystemの各アプリケーションをテストし、毎回アプリケーションをテストしました。私は行方不明ですか?

+0

アン、ここで同様の問題への答えを受け入れるhttps://stackoverflow.com/a/12675503/5233410 – Nkosi

+0

を試すことができますしてみてくださいこれが問題であれば、 "Load User Profile"をtrueに設定してみてください。もしそうでなければ、IISで – Shahbaz

+0

@Nkosiが試してみましたが、動作しません。私はWeb Core APIを使用しています。私は偽装が異なって動作すると思います。たぶん私は偽装を使用する必要がありますか?しかし、AJAXを使うときはそうする必要はありません。だからC#をどうして違うのですか? – arame3333

答えて

0

私はわからないんだけど、この

if (System.Web.HttpContext.Current.User.Identity.IsAuthenticated) 
{ 
    string username = System.Web.HttpContext.Current.User.Identity.Name; 
} 

またはあなたが

var user = (System.Security.Principal.WindowsIdentity)HttpContext.Current.User.Identity; 
var userName = user.Impersonate(); 
+0

いくつかの調査を行ったところ、AJAXからの呼び出しがブラウザから自分のIDを取得することがわかりましたが、IIS経由では代わりにアプリケーションプールが使用されます。 IISのソリューションは偽装を使用することですが、今私はそれを検討しています。 – arame3333

+0

@ arame3333偽装を追加する場合は、2番目のコードを使用しますが、この部分を追加します。var userName = user.Impersonate()。私はそれを含める答えを編集しました –

+0

@ arame3333あなたはこのリンクをチェックすることができます似たような質問があります[リクエストでクレデンシャルを取得](https://stackoverflow.com/questions/12212116/how-to-get-httpclient-to -with-request-with-the-request/12675503#12675503) –

関連する問題