MVC不坚持认证

时间:2017-04-07 15:22:45

标签: c# asp.net-mvc authentication

我正在处理两个应用程序。他们都需要使用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);
    }
}

是什么导致这个?我的身份验证不应该存储在会话变量中,只要浏览器窗口打开就保存(大致)?我是否需要告诉服务器记住我的数据?

1 个答案:

答案 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);
}

Startup.cs

然后在启动时注册OWIN Cookie中间件。

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = "ApplicationCookie",
            LoginPath = new PathString("/Account/Login")
        });
    }
}

如果将它们存储在Principle对象中,您甚至不需要自定义属性AccountsAuthorizeITAttribute