【问题标题】:Why my asp.net identity -user will log out automatically为什么我的 asp.net 身份 -user 会自动注销
【发布时间】:2017-12-27 15:23:00
【问题描述】:

我有一个包含 asp.net MVC 和 asp.net WebApi 的项目。

我不知道为什么用户会自动注销,例如当我关闭浏览器时,15 分钟后我看到我需要再次登录,当我将用户重定向到银行网站进行付款后,当银行网站再次将用户重定向到我的网站需要重新登录。

我使用asp.net身份验证cookie,下面是我的StartUp.cs文件代码:

public class Startup
{
    public string Issuer { get; set; }
    public void Configuration(IAppBuilder app)
    {
        Issuer = "http://localhost:37993/";

        ConfigureOAuthTokenGeneration(app);
        ConfigureOAuthTokenConsumption(app);

        app.UseCors(CorsOptions.AllowAll);

        GlobalConfiguration.Configure(WebApiConfig.Register);
        AreaRegistration.RegisterAllAreas();
        //app.UseWebApi(GlobalConfiguration.Configuration);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        //app.UseMvc(RouteConfig.RegisterRoutes);

        //ConfigureWebApi(GlobalConfiguration.Configuration);

    }
    private void ConfigureOAuthTokenGeneration(IAppBuilder app)
    {
        app.CreatePerOwinContext(() => new LeitnerContext());
        app.CreatePerOwinContext<LeitnerUserManager>(LeitnerUserManager.Create);
        app.CreatePerOwinContext<LeitnerRoleManager>(LeitnerRoleManager.Create);

        // Plugin the OAuth bearer JSON Web Token tokens generation and Consumption will be here

        app.UseCookieAuthentication(new CookieAuthenticationOptions()
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new Microsoft.Owin.PathString("/User/Login"),
            ExpireTimeSpan = TimeSpan.FromDays(15),
            Provider = new CookieAuthenticationProvider
            {
                OnApplyRedirect = ctx =>
                {
                    if (!IsForApi(ctx.Request))
                    {
                        ctx.Response.Redirect(ctx.RedirectUri);
                    }
                }
            }
        });
        OAuthAuthorizationServerOptions options = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/api/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(15),
            Provider = new LeitnerOAuthProvider(),
            AccessTokenFormat = new LeitnerJwtFormat(Issuer),
        };
        app.UseOAuthAuthorizationServer(options);
        //app.UseJwtBearerAuthentication(options);
        //app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
        //app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

    }

    private bool IsForApi(IOwinRequest request)
    {
        IHeaderDictionary headers = request.Headers;
        return ((headers != null) && ((headers["Accept"] == "application/json") || (request.Path.StartsWithSegments(new PathString("/api")))));
    }

    private void ConfigureOAuthTokenConsumption(IAppBuilder app)
    {
        var a = AudiencesStore.AudiencesList["LeitnerAudience"];
        string audienceId = a.ClientId;// ConfigurationManager.AppSettings["as:AudienceId"];
        byte[] audienceSecret = TextEncodings.Base64Url.Decode(a.Base64Secret/*ConfigurationManager.AppSettings["as:AudienceSecret"]*/);

        // Api controllers with an [Authorize] attribute will be validated with JWT
        app.UseJwtBearerAuthentication(
            new JwtBearerAuthenticationOptions
            {
                AuthenticationMode = AuthenticationMode.Active,
                AllowedAudiences = new[] { audienceId },
                IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
                {
                    new SymmetricKeyIssuerSecurityTokenProvider(Issuer, audienceSecret)
                }
            });
    }
}

有人知道为什么会出现这个问题吗?

【问题讨论】:

  • 您的身份验证 cookie 在浏览器/fiddler 中的外观如何?是不是偶然的会话cookie?
  • @mohsen ,您的数据库中有没有可能是 securitystamp 字段 null ?你能确认一次吗
  • @Webruster db 中的 securitystamp 是什么?我不知道 asp.net 身份是如何工作的。是否有导师可以正确学习它?我该如何使用 secutrystamp?
  • @OndrejSvejdar 我不知道。我怎么能看到那个 cookie?
  • @mohsen 在你的 sqlserver db 中做了,你将有一个关于 securitystamp 的列,检查它是否存在,如果它存在,值是什么

标签: c# asp.net asp.net-mvc cookies asp.net-web-api2


【解决方案1】:

用户注销的原因是表单身份验证数据和视图状态数据的验证错误。这可能由于不同的原因而发生,包括在托管服务中使用网络农场。您应该在您的项目 webconfig 中检查&lt;machineKey&gt;

如果您的webconfig 中没有&lt;machineKey&gt;,请尝试在您的webconfig 中的&lt;system.web&gt; 之后添加这段代码:

<machineKey
      validationKey="someValue"
      decryptionKey="someValue"
      validation="SHA1" decryption="AES"/>

有一些在线工具可以从中生成机器密钥。你可以查看thisthis

您可以通过this 链接了解更多关于机器密钥的信息。

【讨论】:

    【解决方案2】:

    也许你的ExpireTimeSpan = TimeSpan.FromDays(15) 被忽略了..

    我这样使用 TimeSpan:

    Provider = new CookieAuthenticationProvider
              {
                 OnValidateIdentity =  SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                            validateInterval: TimeSpan.FromMinutes(15),
                            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
              },
              SlidingExpiration = false,
              ExpireTimeSpan = TimeSpan.FromMinutes(30)
    

    添加了配置中缺少的代码。 此外,如果您有“记住我”选项,请确保您已在登录方法中进行了配置。

    var login = await SignInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberMe, shouldLockout: false);
    

    【讨论】:

    • 我忘记了我在应用程序中使用的一些代码。更新了答案。
    【解决方案3】:

    “15 分钟后自动注销”是由于此代码而发生的。

    TimeSpan.FromDays(15)
    

    如果您省略此代码,您将获得您想要的结果或 正常情况下,此值由 60 * 24 = 1440(分钟 - 1 天)设置。 所以常见的过期时间是一天。 但是你设置了 15 分钟,所以问题就出现了。

    【讨论】:

    • 说得很清楚TimeSpan.FromDays(15);这是 15 天,而不是 15 分钟。
    猜你喜欢
    • 1970-01-01
    • 2016-12-27
    • 2017-12-13
    • 2018-09-22
    • 2014-03-03
    • 1970-01-01
    • 2016-11-29
    • 2015-02-15
    • 1970-01-01
    相关资源
    最近更新 更多