问题描述
/// <summary>
/// Resets the current user context.
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult Reset()
{
try { IAppContext.ClientStateManager.RemoveValue(CookieName.ActiveCaseID); } catch { }
try { IAppContext.ClientStateManager.RemoveValue(CookieName.ActiveEventID); } catch { }
try { IAppContext.ClientStateManager.RemoveValue(CookieName.CompanyID); } catch { }
try { IAppContext.ClientStateManager.RemoveValue(CookieName.ConnectionString); } catch { }
try { IAppContext.ClientStateManager.RemoveValue(CookieName.ImpersonateUserToken); } catch { }
try { IAppContext.ClientStateManager.RemoveValue(CookieName.LoginID); } catch { }
try { IAppContext.ClientStateManager.RemoveValue(CookieName.LoginName); } catch { }
try { IAppContext.ClientStateManager.RemoveValue(CookieName.MultiSystem); } catch { }
try { IAppContext.ClientStateManager.RemoveValue(CookieName.ServerName); } catch { }
try { IAppContext.ClientStateManager.RemoveValue(CookieName.SystemID); } catch { }
try { IAppContext.ClientStateManager.RemoveValue(CookieName.UserID); } catch { }
try { IAppContext.ClientStateManager.RemoveValue(CookieName.UserName); } catch { }
LogSecurityEvent(SecurityLogType.InvokedReset);
return Content("Reset Completed");
}
但是由于某种原因,当我导航到适当的URL时,找不到此方法(或其他任何方法)(我收到404错误)。 https://localhost:31503/User/Reset
。我在这台PC上没有SSL证书,但是该Web应用程序确实可以在另一台PC上运行,除非那里很早就设置好了并且忘记了它,否则我也没有PC上的证书。我现在无法使用该PC进行检查,我什至不知道在哪里查看。如果我转到http://localhost:31503/User/Reset
,则该应用程序仅挂起一会儿,然后出现“连接已重置”浏览器错误。当我连接调试器并将其设置为在所有.NET异常时都中断时,我看不到任何异常被吞没。
这是我的RouteConfig
类-很简单,虽然我对路由了解不多,但看起来并不复杂...
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home",action = "Index",id = UrlParameter.Optional }
);
}
}
编辑:哦,有一些相关的内容:今天早晨,“用户/重置”操作“正在工作”(至少显示了预期的消息),但是实际的登录却没有。它给了我空白页。当我连接调试器时,我发现一个名为AppContext
的类将一个异常吞没了,该类除其他外还跟踪数据库连接字符串:
public string ConnectionString
{
get
{
lock (_Lock)
{
if (String.IsNullOrEmpty(_connectionString))
{
object raw = ClientStateManager.GetValue(CookieName.ConnectionString);
if (null != raw)
{
_connectionString = raw.ToString().FromEncryptedBase64();
}
}
return _connectionString;
}
}
}
因此,如果cookie不存在,则该应用程序找不到任何连接字符串,并在尝试连接到数据库时崩溃!我以前不知道这是怎么工作的。在我看来,没有新用户登录是不可能的。然后,我在if
语句之后添加了以下几行来进行修复:
else
{
_connectionString = ConfigurationManager.ConnectionStrings["Root.Properties.Settings.myapp_configConnectionString"].ConnectionString.FromEncryptedBase64();
}
但是,现在我到处都是这些404错误。这是来自web.config的相关行:
<add name="Root.Properties.Settings.myapp_configConnectionString" connectionString="(an encrypted connection string is here)" providerName="System.Data.sqlClient" />
FromEncryptedBase64
只是一种扩展方法,它采用64位基本字符串,将其解码,然后对其应用解密算法;这是一种将连接字符串安全存储在web.config中的方法,而不必以纯文本格式存储它们。
解决方法
我的版本评论是为了使您能够解决您的SSL证书,因为有一个内置的Core工具(也许也是4.x,但是我有一段时间没有使用它了。)
您可能只需要添加一条特定的路由,因为此方法不需要id
,就像默认路由一样。您可以通过以下两种方式之一进行操作:
选项1
// add an explicit route
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "UserReset",url: "User/Reset"
);
routes.MapRoute(
name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home",action = "Index",id = UrlParameter.Optional }
);
}
}
选项2
// attribute based routing in the controller
[HttpGet]
[Route("User/Reset")]
public ActionResult Reset()
{
// your code
}