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_1
にdomainAndUserName
変数を設定します(見られるように、 )、データベースに照会し、最終的にそれが許可されていないと判断します。ユーザー名/パスワードボックスが表示され、ユーザーは承認されたUSER_2の適切な資格情報を入力するようになりました。これで、ユーザーは要求されたリソースにアクセスできます。ユーザーがブラウザを閉じて再オープンし、HttpContextBase
オブジェクトから取得されたWindowsIdentity
が現在のUSER_1アカウントではなく古いUSER_2アカウントを参照しているように見える場合(domainAndUserName
変数が終了します) DOMAIN\USER_1
の代わりにDOMAIN\USER_2
という値)を使用してください。
私はちょっと待ってからUSER_1 WindowsIdentity
を使用するので、再生時にキャッシュ機能のように思えるかもしれませんが、確認することはできませんでした。私はオンラインでいくつかの検索を行いましたが、ブラウザのキャッシュをクリアするだけでなく、IISサーバーでキャッシュを完全に無効にしようとしましたが、このシナリオにはまだ遭遇しています。 AuthorizeCore
の機能のHttpContextBase.User.Identity
を常に現在のWindowsアカウントを参照する方法についての助けや指導は、非常に高く評価されます。
を使用して試すことができますか?セッションに関連付けることはできますか?セッションを無効にしようとしましたか? –
私が理解する限り、私はどんな種類のセッションをセットアップするための特定のロジックも行いません。 – Fizz
私はあなたの特定の質問にお役に立てませんが、あなたのアプローチについてあなたが変えることを提案する多くのことがあります。まず、属性内でデータベースクエリを実行すべきではありません。この属性は、ページの初期化中に実行された以前のクエリに基づいて認可を決定するロジックを持つだけです。次に、属性とweb.configベースの認証を同時に使用しないでください。実際、web.configベースの認証はMVCアプリケーションではno-noとみなされ、属性ベースのメソッドのみに依存する必要があります。 –