ASP.NET Identity 2在cookie身份验证后执行代码



我通过OWIN中间件使用ASP.NET Identity 2身份验证。我使用模板创建了一个新项目,所以最初使用默认生成的代码开始,但做了一些更改(去掉了实体框架,并连接到我自己现有的身份验证中)。这一切都在起作用。

我现在想做的是在用户通过保存的cookie登录后执行代码。我已经查看了Startup.Auth.cs文件中的ConfigureAuth,我对其进行了如下配置:

    public void ConfigureAuth(IAppBuilder app) {
        // Configure the user manager and signin manager to use a single instance
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
        // Enable the application to use a cookie to store information for the signed in user
        // and to use a cookie to temporarily store information about a user logging in with a third party login provider
        // Configure the sign in cookie
        app.UseCookieAuthentication(new CookieAuthenticationOptions {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider {                    
                OnResponseSignIn = ctx => {
                    Log.Trace("On Response Sign In.");
                },
                OnResponseSignedIn = ctx => {
                    Log.Trace("On Response Signed In.");
                },
                OnValidateIdentity = async ctx => {
                    Log.Trace("On Validate Identity.");
                }
            }
        });            
    }

从中我可以看到,只有在用户输入用户名和密码的实际登录过程中,OnResponseSignIn和OnResponsesSignedIn才会被命中。当用户通过保存的cookie进行身份验证时,它们不会被命中。

无论用户是通过用户名/密码还是保存的cookie进行身份验证,OnValidateIdentity都会被命中,并且他们发出的每个请求都会被击中。

我想要的是在通过cookie登录后只执行一次代码。有人知道怎么做吗?如果不是,我想另一种选择是将代码放在OnValidateIdentity中,但放在If语句中,这将阻止它运行,除非它是cookie身份验证后的第一个调用。有人能想到如何做到这一点吗?我所能想到的就是在代码第一次运行后在Session中设置一个变量,并检查它是否存在以防止它被重新运行?

这可能可以通过使用会话变量作为标志来完成,并且只有在未设置时才能完成。

OnValidateIdentity = async context => {
    if (HttpContext.Current.Session["Refreshed"] == null)
    {
        /** do your thing **/
        ...
        HttpContext.Current.Session["Refreshed"] = new object();
    }
}

相关内容

  • 没有找到相关文章

最新更新