我正在处理两个应用程序。他们都需要使用Windows身份验证和匿名访问。所以为了做到这一点,我编辑了web.config来删除授权标签(带有“deny users =”?“”),并且只使用我的自定义授权属性标记了一些操作。麻烦的是,服务器正在“忘记”我。例如,在第一个应用程序上,一个用户报告她必须每隔一段时间尝试访问控制面板。在第二个,我点击登录,我登录,然后我点击任何其他链接(特别是“保存”),我已经注销。
这是我的自定义授权属性之一:
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);
}
}
是什么导致这个?我的身份验证不应该存储在会话变量中,只要浏览器窗口打开就保存(大致)?我是否需要告诉服务器记住我的数据?
答案 0 :(得分:1)
不应该将我的身份验证存储在会话变量中,并保存 (大致)只要浏览器窗口打开?我需要告诉你吗? 服务器要记住我的数据吗?
我个人喜欢使用OWIN Cookie中间件将它们存储在Principle对象中作为Claim。
Here是示例代码。 roleNames
可以是用户指定的Active Directory组。
public void SignIn(User user, IList<string> roleNames)
{
IList<Claim> claims = new List<Claim>
{
new Claim(ClaimTypes.Sid, user.Id.ToString()),
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.GivenName, user.FirstName),
new Claim(ClaimTypes.Surname, user.LastName),
};
foreach (string roleName in roleNames)
{
claims.Add(new Claim(ClaimTypes.Role, roleName));
}
ClaimsIdentity identity = new ClaimsIdentity(claims, AuthenticationType);
IOwinContext context = _context.Request.GetOwinContext();
IAuthenticationManager authenticationManager = context.Authentication;
authenticationManager.SignIn(identity);
}
然后在启动时注册OWIN Cookie中间件。
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "ApplicationCookie",
LoginPath = new PathString("/Account/Login")
});
}
}
如果将它们存储在Principle对象中,您甚至不需要自定义属性AccountsAuthorizeITAttribute
。