0

MVC アプリケーションを開発しており、現在ログオンしているユーザーのパスワード情報を取得するルーチンがあり、PC では正常に動作しますが、アプリケーションをドメインのライブ サーバーに公開すると、できないようです。 AD 情報にアクセスします。現在実行中のasp.net Webアプリケーションで非常によく似たコードを使用しましたが、問題なく動作します。両方のアプリケーションのセキュリティ設定を比較したところ、同じように見えました。ルーチンは次のとおりです。

 public int GetPasswordExpiration()
    {
        PrincipalContext domain = new PrincipalContext(ContextType.Domain);
        string currUserName = WindowsIdentity.GetCurrent().Name;
        UserPrincipal currLogin = UserPrincipal.FindByIdentity(domain, currUserName);
        DateTime passwordLastSet = currLogin.LastPasswordSet.Value; //here is where it chokes***
        int doyPasswordSet = passwordLastSet.DayOfYear;
        int doy = DateTime.Today.DayOfYear;
        int daysSinceLastset = (doy - doyPasswordSet);
        int daysTilDue = (120 - daysSinceLastset);
        return (daysTilDue);

    }

私はドメインの管理者であるため、アプリケーションのアクセス許可に問題があると思いますが、失敗したアプリケーションは動作中のアプリケーションと同じアクセス許可を持っているため、次にどこを見ればよいかわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

0

動作するコードを投稿したいので、私は自分の質問に答えています。Wiktor Zychla は、WindowsIdentity.GetCurrent().Name がログイン ユーザーではなく、アプリケーション プールの ID に適用されるかどうかを尋ねたときに、それを釘付けにしました。実際のところ、Wiktor に感謝します。

これが機能する変更されたコードです。ユーザーIDを取得する方法を変更しました(理由は後述)。

コントローラーコード:

using MyProject.Utilities;  // Folder where I created the CommonFunctions.cs Class

var cf = new CommonFunctions();
string user = User.Identity.Name;
ViewBag.PasswordExpires = cf.GetPasswordExpiration(user);

CommonFunctions のコード

public int GetPasswordExpiration(string user)
    {
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
        UserPrincipal currLogin = UserPrincipal.FindByIdentity(ctx, user);
        DateTime passwordLastSet = currLogin.LastPasswordSet.Value;
        int doyPasswordSet = passwordLastSet.DayOfYear;
        int doy = DateTime.Today.DayOfYear;
        int daysSinceLastset = (doy - doyPasswordSet);
        int daysTilDue = (120 - daysSinceLastset);
        return (daysTilDue);

    }

私を手がかりにしたことの 1 つは、コントローラーですべてのコードを実行することにしたことです。実行すると、「WindowsIdentity という名前はこのコンテキストには存在しません」という赤い波線が表示されました。

文字列 currUserName = WindowsIdentity .GetCurrent().Name;

また、コントローラーで User.Identity.Name を取得して関数に渡した理由は、いったん機能するようになり、コントローラーを間引きたいと思ったときに、関数で User.Identity.Name を取得しようとしたが、取得したためです。次の行の User の下に同じメッセージを含む別の赤い波線: string user = User.Identity.Name; したがって、これは .net のものであり、コントローラーで User.Identiy.Name を取得し、それを関数に渡すだけで、すべてうまくいくと思います。これは本当に私の忍耐力をテストしたものであり、この投稿が他の誰かに役立つことを願っています.

于 2012-06-13T00:57:26.553 に答える