2016-05-27 14 views
4

私はMVC 5ウェブページのセクションを特定のActive Directoryグループのユーザに制限しようとしていますが、[Authorize]属性(コントローラ上)はログインしたユーザをブロックします。次のようにMvc、Authorizeは承認されたユーザをバウンスさせます

マイログインページのコードが背後に見えます:

public class AccountController: Controller 
{ 

    [AllowAnonymous] 
    public ActionResult Login(string returnUrl) 
    { 
     ViewBag.ReturnUrl = returnUrl; 
     return View(); 
    } 

    // POST: /Account/Login 
    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult Login(LoginModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      ActiveDirectoryHelper ad = new ActiveDirectoryHelper(); 

      if (Membership.ValidateUser(model.UserName, model.Password)) 
      { 
       if (ad.CheckGroupMembership(model.UserName)) 
       { 
        FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

        if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") 
         && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) 
        { 
         return Redirect(returnUrl); 
        } 
        else 
        { 
         return RedirectToAction("Index", "Home"); 
        } 
       } 
       else 
       { 
        ModelState.AddModelError("", "Credentials are correct but you are no authorised \n You Need membership in group: HKF-HIT-FortigateAPI-GS"); 
       } 
      } 
      else 
      { 
       ModelState.AddModelError("", "The user name or password provided is incorrect"); 
      } 
     } 
     // if we got this far, something failed, redisplay form 
     return View(model); 
    } 
    // POST: /Account/LogOff 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOff() 
    { 
     FormsAuthentication.SignOut(); 
     return RedirectToAction("Index", "Home"); 
    } 
} 
public class ActiveDirectoryHelper 
{ 
    string group = "HKF-HIT-FortigateAPI-GS"; 
    public bool CheckGroupMembership(string name) 
    { 
     var context = new PrincipalContext(
          ContextType.Domain, 
          "AD-Domain", @"Username", "Password"); 

     var userPrincipal = UserPrincipal.FindByIdentity(
          context, 
          IdentityType.SamAccountName, 
          name); 

     var test = userPrincipal; 

     if (userPrincipal.IsMemberOf(context, 
      IdentityType.Name, 
      group)) 
     { 
      return true; 
     } 
     return false; 
    } 
} 

ユーザーが通過して、ホームコントローラにインデックスにリダイレクトされます。バックloginpageにバウンスでここ

[Authorize] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

そしてユーザーが、彼は認定されなかったかのように次のように

このコントローラは、しかし設定[登録]の値を持ちます。

はまた、これは、web.configファイルである:私はADAuthCookieを見ることができますブラウザで

編集:リクエストデータのAding写真:

アカウントポスト:

enter image description here

フィドラー:

enter image description here

インデックスが取得:

enter image description here

フィドラー:

enter image description here

EDIT:質問はトラフ私はGlobal.asaz.csクラスで私のクックを扱うことはなかった実現のコメントでで結ば素晴らしいガイドを行く後に、解決されています。

Application_PostAuthenticateRequestにオーバーライドを追加すると、私の問題が解決しました。

私が使用して終了コードを追加しました:

protected void Application_PostAuthenticateRequest(Object sender, EventArgs e) 
{ 
    HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 

    if (authCookie != null) 
    { 
     FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 

     JavaScriptSerializer serializer = new JavaScriptSerializer(); 

     CustomPrincipalSerializeModel serializeModel = serializer.Deserialize<CustomPrincipalSerializeModel>(authTicket.UserData); 

     CustomPrincipal newUser = new CustomPrincipal(authTicket.Name); 
     newUser.Name = serializeModel.Name; 
     HttpContext.Current.User = newUser; 
    } 
} 
のGlobal.asaxで

とiも追加しました:私のログインページに

CustomPrincipalSerializeModel serializeModel = new CustomPrincipalSerializeModel(); 
serializeModel.Name = model.UserName; 

JavaScriptSerializer serializer = new JavaScriptSerializer(); 

string userData = serializer.Serialize(serializeModel); 

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
     1, 
     model.UserName, 
     DateTime.Now, 
     DateTime.Now.AddMinutes(15), 
     false, 
     userData); 

string encTicket = FormsAuthentication.Encrypt(authTicket); 
HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); 
Response.Cookies.Add(faCookie); 

+0

フィドラーのようなhttpデバッガーでhttpセッションをデバッグしましたか?あなたはクッキーがそこにあり、リクエストと共にホーム/インデックスに渡されると確信していますか? –

+0

私は/ account/login postと/ Home/indexの結果を取得するためのフィドラーとビジュアルスタジオの出力を追加しました。 – Tobias

答えて

3

AuthorizeAttribute

マイクロソフトのすべてのセキュリティフレームワーク(ID、メンバーシップなど)は、これらのインターフェイスを使用してMVC/ASP.NETと通信します。カスタムセキュリティフレームワークを使用している場合は、これらのインターフェイスを実装し、AcquireRequestState(セッションステートを使用する場合)またはPostAuthorizeRequestイベントで設定する必要もあります。

IPrincipalとの実装例の後者の例については、ASP.NET MVC - Set custom IIdentity or IPrincipalを参照してください。

関連する問題