通常情况下这不会有什么大不了的,但我正在构建一个AngularJS应用程序,而ASP.NET的Identity外部登录(基于OWIN)添加的#正在对AngularJS应用程序造成严重破坏。
你甚至可以在一个默认的新C#ASP.NET MVC网站上看到它,在Startup.Auth.cs.中谷歌没有注释
当用户登录并重定向时,#会添加到url的末尾。我试过自己处理这个重定向,但没有用。。。总是添加一个散列标记。
有什么想法吗?提前谢谢。
更新
默认的解决方案使用一个表单来启动外部登录,如下所示:
using (Html.BeginForm(action, "Account", new { ReturnUrl = returnUrl }))
{
@Html.AntiForgeryToken()
<div id="socialLoginList">
<p>
@foreach (AuthenticationDescription p in loginProviders)
{
<button type="submit" class="btn btn-default" id="@p.AuthenticationType" name="provider" value="@p.AuthenticationType" title="Log in using your @p.Caption account">@p.AuthenticationType</button>
}
</p>
</div>
}
我看不到在请求中添加#的任何内容。
如果你查看Login操作,你会看到它调用自己的私有方法来处理重定向:
private ActionResult RedirectToLocal(string returnUrl) {
if (Url.IsLocalUrl(returnUrl)) {
return Redirect(returnUrl);
}
else {
return RedirectToAction("Index", "Home");
}
}
即使return RedirectToAction("Index", "Home");
被命中,它在url的末尾也有一个#。
我已经尝试过像这样对返回进行编码:return Redirect("/home/index");
,但它的末尾仍然有#。
更新2看起来它只在Chrome中发生。
简短答案
据我所知,你做不到
我遇到过完全相同的问题(尽管在所有浏览器中,不仅仅是Chrome)。当我调查时,我发现散列是在OAuthAuthorizationServerHandler.ApplyResponseGrantAsync方法中硬编码的,代码如下
var appender = new Appender(location, '#');
appender
.Append(Constants.Parameters.AccessToken, accessToken)
.Append(Constants.Parameters.TokenType, Constants.TokenTypes.Bearer);
较长的答案
为了更改它,请投票支持我提出的问题:提供一种机制,在外部登录后重定向时选择哈希"#"分隔符
解决方法
我已经解决了这个问题,选择了一个不是AngularJS应用程序的登录页,该应用程序将#转换为Hashbang#!
。这是我使用过的页面:
<!DOCTYPE html>
<html lang="en">
<head>
<script>window.location.replace('/#!/' + window.location.hash);</script>
<meta charset="utf-8">
<title>Please wait.</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>Please wait.</body>
</html>
希望这能有所帮助。