2017-08-22 1 views
2

FormsAuthenticationのログインとログアウトの役割を設定しようとしています。 @User.Identity.Nameは、これらの設定を使用してWindowsドメインユーザー名を返すのはなぜですか?Windows認証の問題

<authentication mode="Forms"> 
    <forms name="Login" loginUrl="~/User/Login" defaultUrl="~/Home/Index" protection="All" timeout="90" slidingExpiration="true"/> 
</authentication> 

VS2015プロジェクトプロパティ - >開発サーバーでは、Windows認証が[無効]に設定されています。

結果として、フォーム名が@User.Identity.Nameで表示されることがありますが、ほとんどの場合、ログインまたはログアウトするとWindowsドメイン名が取得されます。私は@User.Identity.Nameuser.UserNameを入れているはずです(正しく表示されているかどうか分かります)。

UserControllerでは、私はでFormsAuthenticationTicketを設定しました。ログアウト時

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, user.UserName, DateTime.Now, DateTime.Now.AddMinutes(90), user.RememberMe, user.Roles, FormsAuthentication.FormsCookiePath); 
string hash = FormsAuthentication.Encrypt(ticket); 
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash); 

if (ticket.IsPersistent) 
{ 
    cookie.Expires = ticket.Expiration; 
} 

Response.Cookies.Add(cookie); 
FormsAuthentication.RedirectFromLoginPage(user.UserName, user.RememberMe); 

、私は空にするために同じクッキーを設定し、Session.Abandon()。私はあらゆる種類のものを試してみました

@if (User != null) 
{ 
    <li class="dropdown"> 
     <a class="dropdown-toggle" data-toggle="dropdown"> 
      Logged in as @User.Identity.Name 
      <span class="caret"></span> 
     </a> 

が、私はここに私の髪の毛を抜くことだし、それは私が間違っているつもりだということであるかを理解することはできません。

FormsAuthentication.SignOut(); 
Session.Abandon(); 

HttpContext.User = new GenericPrincipal(new GenericIdentity(string.Empty), null); 

// clear authentication cookie 
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, ""); 
cookie.Expires = DateTime.Now.AddYears(-1); 
Response.Cookies.Add(cookie); 

return RedirectToAction("Login", "User"); 

は、これは私がユーザ名を表示する方法です。

+0

ユーザー名を取得して表示するコードを表示できますか? –

+0

@YvetteColomb質問に追加されました。 web.configにページを管理者ロールに限定する設定があるため、クッキーがクリアされたりオーバーライドされているとは思われません。ユーザーは常にログインしているため、解雇されていません。ゲスト状態(ログアウトするとWindows認証とドメイン名が表示されます)またはWindows認証ではなく「user.UserName」を使用します。それがそれをより良く説明することを望みます。 – kamil1995b

答えて

1

あなたが間違って行うことは、の2つの認証Cookieを作成していることです。

最初のものは、ログアウト時に

FormsAuthentication.RedirectFromLoginPage(user.UserName, user.RememberMe); 

から

Response.Cookies.Add(cookie); 

と別の1から来て、あなたは同様の重複を持っています。ユーザー名を表示する場合、ユーザーは

をautenticatedされていることを確認し、このライン

FormsAuthentication.SignOut(); 

は期限切れのフォームが応答にクッキー追加していますが、再び

Response.Cookies.Add(cookie); 

そして最後にではなく、少なくともそれを行います

@if (User != null && User.Identity != null && User.Identity.IsAuthenticated) 

そうしないと、認証されていない要求のユーザー名が表示される危険性があります。あなたは何をすべき

  1. へのHTTPデバッガ(フィドラー、チャールズ、げっぷ)を使用して正しく認証を処理することを確認し、すべてのコントローラ/アクションがAuthorize

  2. が飾られています作ります1つの認証Cookieがサーバーからクライアントに送信されていることを確認し、連続した要求を返します。必要に応じて

  3. クリア任意のブラウザで保留中のクッキーを重複 - それはあなたのWindowsユーザー名と長寿命の永続的なCookieを作成し、ブラウザがすべてのリクエストで、この保留中のクッキーを送信した以前のの一つが試行失敗いる可能性があります。

+0

Windowsドメイン名を取得するOPはどうですか? –

+0

@WiktorZychlaそれがあるかもしれませんが、ログインから追加を削除してログアウトからSignOutを削除しても、Windowsドメインユーザー名を表示してもそれが維持されます。ブラウザのCookie /キャッシュがクリアされました。 – kamil1995b

+0

Fiddlerは、ログイン時に、この奇妙な値に設定されていることを伝えます。 'Login = C4BEFC0ED0C83C0B077C8D8FD300F86 ... 'など。ログアウトすると、クッキーはこれに設定されます。 'Set-Cookie:Login =; expires = Mon、22-Aug-2016 10:19:09 GMT;パス=/'。重複はありません。ボックスがチェックされていないときにも、 'PersistentAuth = true'と表示されるようです。 – kamil1995b