ASP.Net 4.5注销/登录失败

时间:2015-03-07 00:51:12

标签: c# asp.net login owin logout

我正在构建一个ASP.NET 4.5应用程序(不是MVC的另一个大故事),使用.Net身份验证和最新的Visual Studio 13.昨天我做了一些包管理器更新,其中包括一些微软身份验证更新。一切都很好。当天晚些时候我突然无法退出,没有错误。在网上搜索解决方案,一无所获。今天早上工作正常,然后今天下午晚些时候停止再次工作。在自动登录最后一个用户的Chrome中,注销将无效。在没有自动登录的IE中,登录/注销工作(在Chrome停止工作之后)一段时间但突然登录停止工作。我试过关闭IE,重新启动计算机 - 没有运气。作为程序员,这种工作/不行为是令人不安的。

我的退出代码位于退出页面中         protected void Page_Load(object sender,EventArgs e){
            。Context.GetOwinContext()Authentication.SignOut();             Session.Abandon();

        //Context.GetOwinContext().Authentication.SignOut();
        //FormsAuthentication.SignOut();
        //HttpContext.Current.GetOwinContext().Authentication.SignOut();
        //Session.Abandon();
        //Roles.DeleteCookie();

        //FormsAuthentication.SignOut();
        //Session.Clear();
        //Session.RemoveAll();
        //Session.Abandon();

        Response.Redirect("~/Default.aspx", true);
    }

我在评论中留下了我尝试的所有不同的东西。注销工作时,未注释的工作正常,就像我登录时的IE一样。

我在Chrome发生故障时会收到此错误,而且我发现它的时间是4次。我怀疑它是否相关。

System.Web.HttpException (0x80004005): Server cannot append header after HTTP headers have been sent.

at System.Web.HttpHeaderCollection.SetHeader(String name,String value,Boolean replace)    在System.Web.HttpHeaderCollection.Set(String name,String value)    在Microsoft.Owin.Host.SystemWeb.CallHeaders.AspNetResponseHeaders.Set(String key,String [] values)    在Microsoft.Owin.Host.SystemWeb.CallHeaders.AspNetResponseHeaders.set_Item(String key,String [] value)    在Microsoft.Owin.Infrastructure.OwinHelpers.SetHeaderUnmodified(IDictionary 2 headers, String key, String[] values) at Microsoft.Owin.Infrastructure.OwinHelpers.AppendHeaderUnmodified(IDictionary 2个header,String key,String [] values)    在Microsoft.Owin.HeaderDictionary.AppendValues(String key,String [] values)    在Microsoft.Owin.Infrastructure.ChunkingCookieManager.AppendResponseCookie(IOwinContext上下文,字符串键,字符串值,CookieOptions选项)    在Microsoft.Owin.Security.Cookies.CookieAuthenticationHandler.d__f.MoveNext()

我的代码中的try / catch语句中没有重定向。我解决了这个问题。

这是我的初创公司,它几乎就是默认的。

    public partial class Startup {


    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301883
    public void ConfigureAuth(IAppBuilder app)
    {
        // Configure the db context, user manager and signin manager to use a single instance per request
        app.CreatePerOwinContext(ApplicationDbContext.Create);
        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"),
            //ExpireTimeSpan = new System.TimeSpan(14, 0, 0, 0),
            SlidingExpiration = false,
            Provider = new CookieAuthenticationProvider
            {
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)),
                    OnException = context => { 
                        Debug.Log(this, "CookieAuthenticationProvider exception: \n" + context.Exception.ToString());
                    }
            }
        });

        // Use a cookie to temporarily store information about a user logging in with a third party login provider
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        // Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process.
        app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));
      app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);

    }

SlidingExpiration是真的,我尝试了False看到它会有所帮助因为某个地方的评论,它没有帮助。这一切都非常神秘,登录/注销失败没有例外。我想知道它可能与cookie有关。

在这一点上,我想知道我是否可以信任Owin,如果它可以将这种神秘的失败拉到蓝色之外 - 当它失败时我正在处理完全不相关的形式 - 它有效/它没有。身份验证必须适合我开发,更不用说发布产品了。对于备用身份验证系统的任何建议都是受欢迎的,我想我可以编写自己更简单的一个,但我没有时间(至少我可以调试它)。

乔治

1 个答案:

答案 0 :(得分:0)

using Microsoft.AspNet.Identity;

protected void Unnamed_LoggingOut(object sender, LoginCancelEventArgs e)
{
    Context.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
    Session.Abandon();
}

清除Cookie名称.AspNet.ApplicationCookie