AspNet Identity MVC - 如何捕获已签名的事件

时间:2017-11-23 18:14:24

标签: asp.net-mvc

我正在使用ASPNet Identity 2.0(完整框架,而不是核心框架)和MVC。 我想在用户成功登录网站后执行C#代码。

我知道我可以在SignInManager.PasswordSignInAsync命令之后立即编写一些代码,它可以用于新登录,但不适用于使用过的用户"记住我"功能并稍后返回到站点(Cookie身份验证)。

我正在寻找一个选项,通过输入密码和使用&#34来记住登录到网站的所有用户的事件;记住我" cookie中。

3 个答案:

答案 0 :(得分:3)

您可以通过处理 global.asax 文件中的应用程序事件来实现此目的。

protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {
            if (Request.IsAuthenticated)
            {
                Response.Write("HELLO");
            }
        }

答案 1 :(得分:1)

有很多方法可以做到这一点。您可以创建和使用自定义属性。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class CustomAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
    {
        readonly IAuthentication _authentication;

        public CustomAuthorizeAttribute(IAuthentication authentication)
        {
            _authentication = authentication;
        }

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (!_authentication.Authorize(filterContext.HttpContext))
                filterContext.Result = new HttpUnauthorizedResult();
          //your code .....
        }
    }

现在而不是使用[授权]使用新的[CustomAuthorizeAttribute]属性

[CustomAuthorizeAttribute]
public ActionResult Index()
{
    ViewBag.Title = "Welcome";
    ViewBag.Message = "Welcome to ASP.NET MVC!";    
    return View();
}

答案 2 :(得分:0)

您接下来的是FormsAuthentication_OnAuthenticate(我感谢问题中未提及基于表单的身份验证,但它是基于Cookie的一个示例,记住我的身份验证,随意调整)

不幸的是,OnCookieBasedFormsAuthenticate_SessionCreate没有触发器:)

所以你可以做的就是经常检查基于表单的身份验证,因为它(和Application_AuthenticateRequest)会针对每个请求,CSS页面,图像等被触发,每次请求都要多次检查数据库是一个过度资源饥饿的想法。幸运的是,表单cookie票证已经发布,我们可以使用它来检查:

public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args)
    {
        if (FormsAuthentication.CookiesSupported)
        {
            if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
            {
                try
                {
                    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(
                      Request.Cookies[FormsAuthentication.FormsCookieName].Value);

                    if ((DateTime.Now - ticket.IssueDate).TotalMinutes > 10)
                    {
                        if(/*Insert logic to check username here with ticket.Name*/)
                        {
                            //recreate cookie with new issuedate
                            FormsAuthentication.SetAuthCookie(ticket.Name, ticket.IsPersistent);
                        }
                        else
                        {
                            FormsAuthentication.SignOut();
                        }
                    }
                    Debug.WriteLine($"{ticket.Name} {ticket.IssueDate.ToUniversalTime()}");
                }
                catch (Exception e)
                {
                    //Elmah
                    ErrorSignal.FromCurrentContext().Raise(e);
                    //Cannot decrypt cookie, make the user sign in again
                    FormsAuthentication.SignOut();
                }
            }
        }
        else
        {
            throw new HttpException("Cookieless Forms Authentication is not supported for this application.");
        }
    }

这与Cookie过期不同,因为用户仍将保留登录状态;除非帐户不再有效,否则用户永远不应该看到任何登录请求。