C# MVC不支持身份验证
我正在开发两个应用程序。它们都需要使用Windows身份验证和匿名访问。为此,我编辑了web.config以去掉带有deny users=?的authorization标记?并且只使用我的自定义授权属性标记了一些操作。问题是,服务器忘记了我。例如,在第一个应用程序中,一个用户报告说,她必须每隔一段时间尝试访问控制面板,以便进行编辑。在第二个链接上,我单击login,我已登录,然后单击任何其他链接(尤其是save),我已注销 以下是我的一个自定义授权属性:C# MVC不支持身份验证,c#,asp.net-mvc,authentication,C#,Asp.net Mvc,Authentication,我正在开发两个应用程序。它们都需要使用Windows身份验证和匿名访问。为此,我编辑了web.config以去掉带有deny users=?的authorization标记?并且只使用我的自定义授权属性标记了一些操作。问题是,服务器忘记了我。例如,在第一个应用程序中,一个用户报告说,她必须每隔一段时间尝试访问控制面板,以便进行编辑。在第二个链接上,我单击login,我已登录,然后单击任何其他链接(尤其是save),我已注销 以下是我的一个自定义授权属性: public class Account
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;
}
}
要登录,我的_布局中只有以下内容:
@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);
}
}
这是什么原因造成的?我的身份验证是否应该存储在会话变量中,保存时间大致与浏览器窗口打开的时间相同?我需要告诉服务器记住我的数据吗
我的身份验证不应该存储在会话变量saved中吗
大概只要浏览器窗口打开就可以了?我需要告诉你吗
服务器要记住我的数据吗
我个人喜欢使用OWIN Cookie中间件将它们作为声明存储在Principle对象中
是示例代码。角色名称可以是用户分配的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);
}
如果将它们存储在Principle对象中,您甚至不需要自定义属性AccountsAuthorizeITAttribute。您使用什么进行身份验证?表单、成员资格、身份?web.config中的授权标记用于ASP.NET web表单。您不应该在ASP.NET MVC中使用。您是否使用Active Directory进行身份验证?请显示您的登录代码。@SalvadorGuerrero否。什么是machinekey?身份验证不存储在会话变量中。会话永远不应用于身份验证。这是不安全和不可靠的,因为会话可能在任何时候丢失。IIS不保证会话保持活动状态。身份验证由一个特殊的身份验证cookie进行处理,该cookie是临时的,不存储在磁盘上,或者是持久的,存储在磁盘上。我也不明白为什么需要自定义授权属性。您所要做的就是使用标准的[AuthorizationRole=CT-IT],它与您的自定义属性完全相同。我尝试将其改编为用于查找active directory组的代码,忽略ClaimTypes.Sid和用户未提供的其他声明类型,使用Windows而不是ClaimSidenty中的AuthenticationType,但我什么都找不到GetowInText。这是我需要安装的软件包吗?你可以查看所有需要的软件包。太好了,我可以安装一些owin软件包并编译所有的东西。但是,有两个问题:1.每当我启动应用程序时,无论我尝试启动哪个页面,它都会将自身重定向到登录页面;2.由于某种原因,它重定向到的登录页面会重定向到自身。我多次遇到错误:请求过滤模块被配置为拒绝查询字符串过长的请求。我尝试在登录代码中设置断点,但没有成功。我想我注定要创建一个公共版本和一个windows身份验证版本。您需要在登录HttpGet方法和HttpPost方法上放置[AllowAnonymous]属性。因此,使用此方法意味着我无法将某些区域设置为公共区域,而将某些区域设置为私有区域?
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "ApplicationCookie",
LoginPath = new PathString("/Account/Login")
});
}
}