2

私は一般に基本認証を使用するMVCアプリケーションを持っています。これにより、アプリケーションユーザをcetain管理機能のために別のActive Directoryユーザに変更することができます。私たちは、このようにresponse.StausCode = 401を設定することでこれを行う: -ASP.NET MVC 401 - ログインのプロンプトが表示されない

Response.Clear(); 
Response.StatusCode = (Int32)HttpStatusCode.Unauthorized; 
Response.AddHeader("WWW-Authenticate", "Realm=Secured Site"); 
Response.AddHeader("Refresh", "0;"); 
Response.End(); 

これは正常に動作しますが、私はこれで、アプリケーションにWindows認証を使用しようとしているが、それでもユーザーは、以前の方法を使用して変更することができるようにしています。これは、アプリケーションがロードされたとき(つまり、サイトに移動するときに 'changeuser'アクションリンクを選択する)最初に機能するようです。問題は、一度インデックスページから移動すると、 'changeuser'アクションリンクは、401が設定されているにもかかわらず、ユーザーにもうログインを促さないことです。

ご了承ください。

+0

私は、ユーザーエージェントが要求間の基本的なHTTP認証情報をキャッシュすることをかなり確信している - それは401を取得するときに、それは単純にキャッシュされた資格情報を送り返すユーザーが以前に入力された - それはとにかくリクエストごとに認証情報を送信する必要があります。 –

+0

Basicの場合statuscode = 401を設定するたびにログインウィンドウが表示されます。これは可能であればWindows Authで発生します。 – Parsley

答えて

0

驚いたことに、ブラウザはこれをサポートしていないようです。私は同じようなこと、最後の6月を尋ねる友人のためにこの質問を見つけました:

Logging a user out when using HTTP Basic authentication

彼は別の質問にリンクし、最良の答えは少し愚かである:

How to log out user from web site using BASIC authentication?

基本認証ログアウトを管理するようには設計されていませんでした。あなたはそれをすることができますが、完全には自動的にはできません。

あなたがしなければならないことは、ユーザーにログアウトリンクをクリックさせ、同じレルムを使用し、ログインを要求した通常の401と同じURLフォルダレベルで「401 Unauthorized」を送信することです。

次に、間違った資格情報を入力するように指示する必要があります。空のユーザー名とパスワードを入力すると、「あなたは正常にログアウトしました」ページが返されます。誤った/ブランクの資格情報は、以前の正しい資格情報を上書きします。

+0

Dannyさんのお手伝いがあります。私は '基本認証'がほんとうにうまく動いていますが、StatusCodeを401に設定してログインボックスが表示されない問題は 'Windows認証'で発生します。 – Parsley

+0

これは同じことだと思います。ブラウザはキャッシュしています基本認証なので、401ヘッダーを見ると基本認証情報をもう一度送信します:-( –

1

あなたはそれを行うことができますが、少しトリッキーが必要です。このコードは、 "異なるユーザーとしてログイン"機能を持つMicrosoft.TeamFoundation.WebAccessを逆コンパイルし、MVCを使用するようにリファクタリングすることに基づいています。

namespace WindwsAuthTest.Controllers { 
    public class HomeController : Controller { 
     public ActionResult Index() { 
     ViewBag.Message = "Welcome to ASP.NET MVC!"; 
     return View(); 
     } 

     public ActionResult About() { 
     return View(); 
     } 

     public ActionResult Logout() { 
     return View(); 
     } 

     public ActionResult SignInAsDifferentUser() { 

     HttpCookie cookie = base.Request.Cookies["TSWA-Last-User"]; 

     if (base.User.Identity.IsAuthenticated == false || cookie == null || StringComparer.OrdinalIgnoreCase.Equals(base.User.Identity.Name, cookie.Value)) { 

      string name = string.Empty; 
      if (base.Request.IsAuthenticated) { 
       name = this.User.Identity.Name; 
      } 

      cookie = new HttpCookie("TSWA-Last-User", name); 
      base.Response.Cookies.Set(cookie); 

      base.Response.AppendHeader("Connection", "close"); 
      base.Response.StatusCode = 0x191; 
      base.Response.Clear(); 
      //should probably do a redirect here to the unauthorized/failed login page 
      //if you know how to do this, please tap it on the comments below 
      base.Response.Write("PageResources.UnauthorizedAccessMessage"); 
      base.Response.End(); 
      return RedirectToAction("Index"); 
     } 

     cookie = new HttpCookie("TSWA-Last-User", string.Empty) { 
      Expires = DateTime.Now.AddYears(-5) 
     }; 
     base.Response.Cookies.Set(cookie); 

     return RedirectToAction("Index"); 
     } 
    } 
} 
関連する問題