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

时间:2015-12-22 15:21:34

标签: asp.net asp.net-mvc asp.net-identity

我通过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和OnResponseSignedIn仅在用户输入用户名和密码时在实际登录期间被点击。当用户通过保存的cookie进行身份验证时,它们不会被点击。

无论用户是通过用户名/密码进行身份验证还是保存了Cookie,都会点击OnValidateIdentity,并且会针对他们发出的每个请求点击它。

我喜欢的是在通过cookie登录后执行一次代码。有谁知道如何做到这一点?如果没有,我想另一个选择是将代码放在OnValidateIdentity中,但是在if语句中会阻止它运行,除非它是在cookie身份验证之后的第一次调用。任何人都可以想到如何实现这一目标吗?我能想到的是在首次运行代码后在Session中设置变量并检查它是否存在以防止它重新运行?

1 个答案:

答案 0 :(得分:0)

它可能可以通过使用会话变量作为标志来完成,并且仅在未设置时执行您的操作。

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

        HttpContext.Current.Session["Refreshed"] = new object();
    }
}