私は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写真:
アカウントポスト:
フィドラー:
インデックスが取得:
フィドラー:
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);
。
フィドラーのようなhttpデバッガーでhttpセッションをデバッグしましたか?あなたはクッキーがそこにあり、リクエストと共にホーム/インデックスに渡されると確信していますか? –
私は/ account/login postと/ Home/indexの結果を取得するためのフィドラーとビジュアルスタジオの出力を追加しました。 – Tobias