2017-04-12 6 views
4
私は Web.configファイルに次の <system.web>のセクションでのWindows認証モードを使用して、イントラネット上で動作するC#ASP.NET MVCアプリケーションに取り組んでいます

古いHttpContextBase WindowsIdentity

<system.web> 
    <compilation debug="true" targetFramework="4.5.2" /> 
    <httpRuntime targetFramework="4.5.2" /> 
    <authentication mode="Windows" /> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
    <identity impersonate="true" /> 
</system.web> 

接続するWindowsアカウントに基づいて処理するために、AuthorizeAttributeを拡張する独自のクラスを作成しました。オーバーライドされたAuthorizeCore関数内でHttpContextBase.User.IdentityからWindowsIdentityオブジェクトを取得し、それを使用して名前、ドメインなどのデータを取得します。次に、このデータを使用してデータベース内の特定のレコードを照会し、正しいか間違っているか。 falseを返すと、ブラウザは単純なユーザ名とパスワードボックスをポップアップします。これにより、ユーザは、現在のユーザがログインしているものとは別のWindowsアカウント/パスワードを提供することができます。

AuthorizeCore機能は私のプロジェクトでどのように見えるかのサンプルは以下の通りです:

protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    using (DbEntities dbContext = new DbEntities()) 
    { 
     bool authorize = allowedGroups.Length == 0; 
     string domainAndUserName = httpContext.User.Identity.Name; 
     int userNameIndex = domainAndUserName.IndexOf(@"\", StringComparison.OrdinalIgnoreCase) + 1; 
     string userName = domainAndUserName.Substring(userNameIndex); 

     try 
     { 
      // Process account and query database... 
      // set authorize to true if criteria met, otherwise false... 
     } 
     catch (EntityException ex) 
     { 
      authorize = false; 
     } 
     catch (SqlException ex) 
     { 
      authorize = false; 
     } 

     return authorize; 
    } 
} 

のは、WindowsアカウントのUSER_1を持つユーザーが接続していると仮定しよう、AuthrorizeCore機能は、DOMAIN\USER_1domainAndUserName変数を設定します(見られるように、 )、データベースに照会し、最終的にそれが許可されていないと判断します。ユーザー名/パスワードボックスが表示され、ユーザーは承認されたUSER_2の適切な資格情報を入力するようになりました。これで、ユーザーは要求されたリソースにアクセスできます。ユーザーがブラウザを閉じて再オープンし、HttpContextBaseオブジェクトから取得されたWindowsIdentityが現在のUSER_1アカウントではなく古いUSER_2アカウントを参照しているように見える場合(domainAndUserName変数が終了します) DOMAIN\USER_1の代わりにDOMAIN\USER_2という値)を使用してください。

私はちょっと待ってからUSER_1 WindowsIdentityを使用するので、再生時にキャッシュ機能のように思えるかもしれませんが、確認することはできませんでした。私はオンラインでいくつかの検索を行いましたが、ブラウザのキャッシュをクリアするだけでなく、IISサーバーでキャッシュを完全に無効にしようとしましたが、このシナリオにはまだ遭遇しています。 AuthorizeCoreの機能のHttpContextBase.User.Identityを常に現在のWindowsアカウントを参照する方法についての助けや指導は、非常に高く評価されます。

+0

を使用して試すことができますか?セッションに関連付けることはできますか?セッションを無効にしようとしましたか? –

+0

私が理解する限り、私はどんな種類のセッションをセットアップするための特定のロジックも行いません。 – Fizz

+1

私はあなたの特定の質問にお役に立てませんが、あなたのアプローチについてあなたが変えることを提案する多くのことがあります。まず、属性内でデータベースクエリを実行すべきではありません。この属性は、ページの初期化中に実行された以前のクエリに基づいて認可を決定するロジックを持つだけです。次に、属性とweb.configベースの認証を同時に使用しないでください。実際、web.configベースの認証はMVCアプリケーションではno-noとみなされ、属性ベースのメソッドのみに依存する必要があります。 –

答えて

-1

あなたは、あなたのアプリケーションでセッションを使用しています.current

HttpContext.Current.User.Identity.Name 
関連する問題