URL编码#sharp到Durandal SPA

时间:2014-04-03 09:12:09

标签: asp.net-mvc asp.net-web-api durandal

我知道没有必要为 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因为我将来可能在其他情况下遇到同样的问题。

2 个答案:

答案 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);
        }
    }

在我的代码中,我检查重定向,如果启用了表单身份验证,并且用户是否经过身份验证,则相应地更改响应。对于您的代码,您可以更改响应以转到正确的登录页面?