当应用程序以“不进行调试的开始”运行时,未将用户识别为已登录,当以“开始调试”运行时,用户身份验证可以正常工作

时间:2019-06-25 16:42:12

标签: asp.net-mvc vb.net visual-studio authentication asp.net-identity

我已经从VB的ASP.NET MVC Web应用程序项目模板开始,在Visual Studio 2019中构建了一个小型ASP.NET Web应用程序,该模板使用默认的“个人用户帐户”进行身份验证。我快要结束开发了,在运行应用程序时,如果没有通过CTRL-F5附加调试器就无法登录到我的应用程序,那么我将无法登录。通过F5附加调试器来运行应用程序:启动调试以及附加调试器的任何其他运行方法都可以使应用程序按预期方式运行。

启动时,Web应用程序要求用户登录。成功登录后,预期的行为是重定向到主页,但是当前成功登录仅再次显示登录页面,我相信该应用程序不会无法识别该用户已通过身份验证。

我从旧的清理,重新编译和重建开始调试,但没有运气。在登录方法的成功语句中添加了throw语句,并验证了登录尝试确实成功。带有此throw语句的登录方法(位于AccountController.vb中)如下所示。尝试登录确实会触发SignIn.Success情况。

' POST: /Account/Login
<HttpPost>
<AllowAnonymous>
<ValidateAntiForgeryToken>
Public Async Function Login(model As LoginViewModel, returnUrl As String) As Task(Of ActionResult)
    If Not ModelState.IsValid Then
        Return View(model)
    End If

    ' This doesn't count login failures towards account lockout
    ' To enable password failures to trigger account lockout, change to shouldLockout := True
    Dim result = Await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout := False)
    Select Case result
        Case SignInStatus.Success
            Throw New System.Exception("Sign In Succeeded") 'Throws both with and without the debugger attached
            Return RedirectToLocal(returnUrl)
        Case SignInStatus.LockedOut
            Return View("Lockout")
        Case SignInStatus.RequiresVerification
            Return RedirectToAction("SendCode", New With {
                returnUrl,
                model.RememberMe
            })
        Case Else
            ModelState.AddModelError("", "Invalid login attempt.")
            Return View(model)
    End Select
End Function

奇怪的是,即使我删除了项目中仅有的两个<Authorize>属性,仍然无法登录,我认为这将完全消除登录屏幕。 (它们被附加到AccountControllerManagerController类上,并且它们的位置与我过去使用相同的项目模板完成的其他项目相匹配)

我可以找到的仅有的相关互联网资源之一是this SO question。我正在构建和部署到targetFramework 4.7.2,并且我的web.config文件是由项目模板生成的,除了数据库连接字符串之外,但我已经包含了它,以防万一有人发现问题。

<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=my secret token" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=very secret connection string"
         providerName="System.Data.SqlClient" />
  </connectionStrings>
  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <authentication mode="None" />
    <compilation debug="true" targetFramework="4.7.2" />
    <httpRuntime targetFramework="4.7.2" />
    <roleManager enabled="true" defaultProvider="MySqlRoleProvider">
      <providers>
        <add name="MySqlRoleProvider"
        type="System.Web.Security.SqlRoleProvider"
        applicationName="RFIDDataEntry"
        connectionStringName="DefaultConnection"/>
      </providers>
    </roleManager>
  </system.web>
  <system.webServer>
    <modules>
      <remove name="FormsAuthentication" />
    </modules>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      ....
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
</configuration>

TLDR:,即使登录尝试成功,在未连接调试器的情况下运行该应用程序时,我的VB.NET Web应用程序也无法将用户识别为已登录。

2 个答案:

答案 0 :(得分:0)

我可以通过删除 .vs 文件夹来解决此问题。

答案 1 :(得分:0)

最近几天我也遇到了同样的问题。我的浏览器是Edge Developer。删除.vs文件夹后,问题仍然存在。然后,我从浏览器和Voila中删除了所有缓存,问题解决了。