У меня есть модуль intr anet, который требует успешной аутентификации windows для открытия страницы индекса, затем на основе DOMAIN \ USERNAME (используя HttpContext) я получаю роль в таблице SQL.
В настоящее время для ролей я использую шаблон basi c RoleProvider для использования [Authorize(Roles = "admin,customer")]
для каждой страницы в HomeController, который работает в режиме аутентификации форм (имел базовую c форму имени пользователя / пароля), но не в режиме windows, потому что я получаю внутренний логин l oop, я попробовал несколько SO-решений, и вот как выглядит мой файл WebConfig:
<system.webServer>
<modules>
<remove name="FormsAuthenticationModule" />
<remove name="FormsAuthentication" />
</modules>
</system.webServer>
<system.web>
<customErrors mode="Off" />
<sessionState timeout="1"></sessionState>
<authentication mode="Windows">
<forms loginUrl="~/Account/Login" protection="All" timeout="5"></forms>
</authentication>
<roleManager defaultProvider="roleProv" enabled="true">
<providers>
<clear />
<add name="roleProv" type="proj.classCS.roleProvider" enabled="true" />
</providers>
</roleManager>
Код alse проверяет тайм-аут в сеансе для перенаправления на страницу входа в систему при неактивности, причем оба перенаправления на страницу индекса, но в зависимости от пунктов меню роли различаются ...
[HttpPost]
public ActionResult Login(usuario u, string retornaUrl)
{
//USER PRESS LOGIN BUTTON
//WINDOWS AUTH PROMPT
//IF WINDOWS AUTH IS SUCCESSFULL
//GET WINDOWS USER DOMAIN
string userDomWin = System.Web.HttpContext.Current.Request.LogonUserIdentity.Name.ToString().Substring((HttpContext.User.Identity.Name.ToString().IndexOf("\\")) + 1);
string userWin = userDomWin.Replace("DOM\\", "");
//VALIDATE IF NETWORK USERNAME EXISTS ON SQL TABLE
var userNet = (from d in db.user
where d.userNet == userWin
select d.userNet).FirstOrDefault();
if (userNet != null)
{
//FormsAuthentication.SetAuthCookie(u.userNet, false);
Session["uname"] = userNet.ToString();
if (userNet != null)
{
return Redirect("~/Home/Index");
}
else
{
//CONN TIMEOUT / LOGOUT
TempData["Message"] = "SESSION TIMEOUT";
return Redirect("~/Account/Login");
}
}
else
{
//ON ERROR REDIRECT TO LOGIN PAGE WITH MESSAGE
TempData["Message"] = "TRY NEW CREDENTIALS";
return Redirect("~/Account/Login");
}
return View();
}