我正在使用ASPNet Identity 2.0(完整框架,而不是核心框架)和MVC。 我想在用户成功登录网站后执行C#代码。
我知道我可以在SignInManager.PasswordSignInAsync
命令之后立即编写一些代码,它可以用于新登录,但不适用于使用过的用户"记住我"功能并稍后返回到站点(Cookie身份验证)。
我正在寻找一个选项,通过输入密码和使用&#34来记住登录到网站的所有用户的事件;记住我" cookie中。
答案 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过期不同,因为用户仍将保留登录状态;除非帐户不再有效,否则用户永远不应该看到任何登录请求。