2

フォーム認証を使用するプロジェクトを継承しましたが、最近の機能要求で、一部のユーザーのWindowsユーザー名を取得する必要があります。

これはフォーム認証を使用するWebサイトです(これを変更したくないので、現時点では手間がかかりすぎます)が、内部ユーザーがより簡単にログインできるようにする機能要求がありました(通常は入力する必要はありません)。パスワードまたはユーザー名)。

私の現在の方法は恐ろしいです。IPアドレスをチェックして、IPのいずれかから接続しているかどうかを確認し、接続している場合は、Windows認証を使用する別のプロジェクトにリダイレクトしてから元のページにリダイレクトします。ユーザー名を含むクエリ文字列(このメソッドを使用し続ける必要がある場合は、おそらくこれを暗号化する必要がありますが、それでも私が望むほど安全ではありません)。

アプリ内でWindows認証を比較的簡単に実行できますが、難しいのはWindowsユーザー名を取得することです。私はそれを行う方法を理解できなかったので、私のかなり醜い方法です。

どんな助けでも大歓迎です。

編集:私のセカンダリアプリはこれを行うだけです:

string username = HttpContext.Current.User.Identity.Name;
string retpath = Request.QueryString["retpath"];
Response.Redirect("http://" + retpath + "?id=" + username);
4

2 に答える 2

1

この記事には答えが含まれていました(vinodpthmnに感謝):http ://msdn.microsoft.com/en-us/library/ms972958.aspx 調査でこの記事へのリンクを見つけましたが、どれも機能しませんでした。ようやく読んで問題を解決できてよかったです。

前述したように、クライアントのWindowsユーザー名を取得するだけで済みましたが、それは非常に面倒であることが判明しました。ありがたいことに、実際のソリューションは比較的単純でした。

まず、追加のログインページ(私は私のwinlogin.aspxと呼びます)を作成し、次のようにWeb.Configファイルのデフォルトのログインページとして設定する必要があります。

<authentication mode="Forms">
      <forms name="something" defaultUrl="default.aspx" loginUrl="winlogin.aspx" protection="All" slidingExpiration="true" timeout="90"/>
    </authentication>

winlogin.aspx.csファイル内では、Windowsユーザーを認証して使用します

FormsAuthentication.RedirectFromLoginPage(username, false/true);

彼らが行くところに彼らをリダイレクトするため。実際のwinlogin.aspxページは空白である必要があり、ユーザーには表示されません。

この次の部分のために、テストWebサーバーに公開する必要があります。IISマネージャーでwinlogin.aspxのファイルプロパティにアクセスし、WindowsAuthenticationをtrueに設定し、匿名認証をfalseに設定します。また、カスタム401エラーページポインタを作成する必要があります(私の古いLogin.aspxページを指しています)。

Windows認証でログインできるユーザーはログインでき、他のユーザーは古いログインページにリダイレクトされます。

出来上がり!

ただし、いくつかの問題がありますが、リターンURLが失われるため(カスタム401エラーページへのリンクで「=」を使用できないため、何も解析できません)、ユーザーがいるときはいつでもCookieを設定することをお勧めします。はwinloginページにリダイレクトされ、フォームのログインページでそのCookieにアクセスして、ユーザーを適切にリダイレクトします。

ご不明な点がございましたら、上記のリンク先の記事をお読みになるか、こちらからお気軽にご質問ください。

皆さんの助けに感謝します!

于 2012-10-23T06:09:46.733 に答える
-1

あなたはディレクトリサービスを使うことができます

PrincipalContext pc = null;
UserPrincipal principal = null;
var username = User.Identity.Name;
pc = new PrincipalContext(ContextType.Domain, "give your domain name here");
principal = UserPrincipal.FindByIdentity(pc, userName);
var firstName = principal.GivenName ?? string.Empty;
var lastName = principal.Surname ?? string.Empty;

System.DirectoryServices.AccountManagementの参照を追加してください

于 2012-10-22T05:52:32.110 に答える