C# MVC不支持身份验证

C# MVC不支持身份验证,c#,asp.net-mvc,authentication,C#,Asp.net Mvc,Authentication,我正在开发两个应用程序。它们都需要使用Windows身份验证和匿名访问。为此,我编辑了web.config以去掉带有deny users=?的authorization标记?并且只使用我的自定义授权属性标记了一些操作。问题是,服务器忘记了我。例如,在第一个应用程序中,一个用户报告说,她必须每隔一段时间尝试访问控制面板,以便进行编辑。在第二个链接上,我单击login,我已登录,然后单击任何其他链接(尤其是save),我已注销 以下是我的一个自定义授权属性: public class Account

我正在开发两个应用程序。它们都需要使用Windows身份验证和匿名访问。为此,我编辑了web.config以去掉带有deny users=?的authorization标记?并且只使用我的自定义授权属性标记了一些操作。问题是,服务器忘记了我。例如,在第一个应用程序中,一个用户报告说,她必须每隔一段时间尝试访问控制面板,以便进行编辑。在第二个链接上,我单击login,我已登录,然后单击任何其他链接(尤其是save),我已注销

以下是我的一个自定义授权属性:

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")
        });
    }
}