【发布时间】:2017-04-07 15:22:44
【问题描述】:
我正在开发两个应用程序。它们都需要同时使用 Windows 身份验证和匿名访问。所以为了做到这一点,我编辑了 web.config 以摆脱授权标签(使用“拒绝用户 =”?“”)并且只用我的自定义授权属性标记了一些操作。麻烦的是,服务器正在“忘记”我。因此,例如,在第一个应用程序上,一个用户报告说她必须每隔一次她想要编辑时尝试访问控制面板。在第二个中,我单击登录,我已登录,然后单击任何其他链接(尤其是“保存”)并退出。
这是我的自定义授权属性之一:
public class AccountsAuthorizeITAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if(httpContext.User.Identity.IsAuthenticated == false)
{
return false;
}
if(httpContext.User.IsInRole("CT-IT"))
{
return true;
}
return false;
}
}
要登录,我的 _layout 中有这个:
@Html.ActionLink("Login", "Login", "Login", new { returnURL = HttpContext.Current.Request.RawUrl }, null)
使用此登录控制器:
public class LoginController : Controller
{
[AccountsAuthorizeIT]
public ActionResult Login(string returnURL)
{
return Redirect(returnURL);
}
}
是什么原因造成的?我的身份验证不应该存储在会话变量中,只要浏览器窗口打开就保存(大约)?我需要告诉服务器记住我的数据吗?
【问题讨论】:
-
您使用什么进行身份验证?表格、会员资格、身份?
-
web.config 中的授权标签用于 ASP.NET Web 窗体。您不应该在 ASP.NET MVC 中使用。您是否使用 Active Directory 进行身份验证?请出示您的登录代码。
-
@SalvadorGuerrero 没有。什么是机器钥匙?
-
身份验证不存储在会话变量中。 Session 永远不应该用于身份验证。这是不安全和不可靠的,因为会话可能随时丢失(IIS 不保证它们会保持活动状态)。身份验证由一个特殊的身份验证 cookie 处理,它可以是临时的(不存储在磁盘上)或持久的(存储在磁盘上)。
-
我也不明白您为什么需要自定义授权属性。您所要做的就是使用标准的
[Authorize(Role="CT-IT")],它的作用与您的自定义属性完全一样。
标签: c# asp.net-mvc authentication