我知道没有必要为 Durandal 登录页面指定登录URL。但我想知道如何解决以下问题我面临着将身份验证重定向到具有Sharp符号(即#)的特定Durandal页面。
public void ConfigureAuth(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
//LoginPath = new PathString("/" + HttpUtility.UrlDecode("#") + "/login")
LoginPath = new PathString("/#/login")
});
...
}
粘贴时:
http://localhost/#/login
到浏览器URL我可以毫无问题地导航到登录页面。我可以登录,它工作正常。
因为我在某些情况下将MVC与SPA混合,当我将[Authorize]属性添加到MVC控制器时,我会按预期重定向到
http://localhost/%23/login?ReturnUrl=%2Fe
我收到错误:
' /'中的服务器错误应用
无法找到资源。 说明:HTTP 404.您要查找的资源(或其中一个依赖项)可能已被删除,名称已更改或暂时不可用。请查看以下网址,确保拼写正确。
请求的网址:/#/ login
如何使用#符号代替%23字符编码?或者我可能搞乱别的东西!!!
供参考: 我的问题与字符编码有关,而不是这个问题:Login page on different domain因为我将来可能在其他情况下遇到同样的问题。
答案 0 :(得分:0)
据我所知,从服务器使用#是不可能的。可能的解决方案是在用户未经过身份验证时,将用户从durandal.js中的shell重定向。
答案 1 :(得分:0)
我不知道生命周期中是否为时已晚,但您可以尝试在Application_EndRequest事件中捕获全局asax文件中的重定向并修复响应。我有这样的代码将actionresult更改为我的js可以使用的jsonresult,以便当用户尝试访问我通过java脚本ajax保护的MVC控制器资源时,我可以正确处理它。
protected void Application_EndRequest()
{
var context = new HttpContextWrapper(this.Context);
// If we're an ajax request and forms authentication caused a 302,
// then we actually need to do a 401
if (FormsAuthentication.IsEnabled && context.Response.StatusCode == 302
&& context.Request.IsAjaxRequest())
{
var jsRet = new JSONFunctionResult<Boolean>();
if (this.Request.IsAuthenticated)
{
jsRet.Messages.Add(new JSONFunctionResultMessage()
{
Text = string.Format("You must have one of these roles to perform the operation: {0}", context.Response.Headers["RolesRequired"]),
Title = "Security Violation",
Type = (int)JSONFunctionResultMessageTypes.authorization
});
}
else
{
jsRet.Messages.Add(new JSONFunctionResultMessage()
{
Text = "You must be logged into to access this resource",
Title = "Security Violation",
Type = (int)JSONFunctionResultMessageTypes.authentication
});
}
jsRet.OperationStatus = JSONFunctionResultOperationStatus.error.ToString();
string jresponse = JsonConvert.SerializeObject(jsRet);
context.Response.Clear();
context.Response.StatusCode = 200;
context.Response.ContentType = "application/json";
context.Response.Write(jresponse);
}
}
在我的代码中,我检查重定向,如果启用了表单身份验证,并且用户是否经过身份验证,则相应地更改响应。对于您的代码,您可以更改响应以转到正确的登录页面?