Brock Allen MembershipReboot with SPA(单页应用程序)Breeze Application Authorization Redirect

时间:2014-08-18 10:22:27

标签: authorization breeze membershipreboot

我已将MembershipReboot与Breeze SPA应用程序集成,登录和授权按预期工作。在BreezeController.cs中,我添加了下面的代码来捕获授权失败。

[AttributeUsageAttribute(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AuthorizeAttribute : System.Web.Http.Filters.AuthorizationFilterAttribute
    {

        public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            base.OnAuthorization(actionContext);

            ////check authentication and return if not authorized
            if (actionContext != null)
            {
                if (!actionContext.RequestContext.Principal.Identity.IsAuthenticated)
                {
                    actionContext.Response = actionContext.ControllerContext.Request.CreateResponse(System.Net.HttpStatusCode.Redirect);
                    System.Web.HttpContext.Current.Server.ClearError();
                    System.Web.HttpContext.Current.Response.Redirect("/UserAccount/Home",true);
                    //***********
                    //REDIRECT BEING CAUGHT BY ANGULAR ERROR HANDLER!!!
                    //**********
                    System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest();


                }

            }
        }
    }

调用以下代码时会发现缺少授权:

[System.Web.Http.HttpGet] [ValidateAntiForgeryToken] [Authorize] public string Metadata() { return _repository.Metadata; }

然而,重定向代码被加载到Toast错误处理程序中并显示为错误,并且重定向无效。

任何想法如何让代码运行而不是加载到错误屏幕中?

2 个答案:

答案 0 :(得分:0)

处理失败的promise并检查错误对象。您应该在那里找到状态代码,告诉您这是授权失败。现在重定向适合您的应用,而不是将错误报告给屏幕。

我想我会把这个“拦截器”放在我的“DataService”/“DataContext”抽象中,以便所有Breeze调用都使用它。谁知道,您可以使用它扩展EntityManager。没想过太多。

当你让它工作时,你可能想与我们所有人分享这个“拦截器”。社区热爱捐款。 : - )

答案 1 :(得分:0)

我注意到app / config.exceptionHandler.js正在捕获创建日志错误的所有错误。我找了异常401(未经授权的访问),如果发现了我的登录模块。

代码很简单:

var app = angular.module('app');

// Configure by setting an optional string value for appErrorPrefix.
// Accessible via config.appErrorPrefix (via config value).

app.config(['$provide', function ($provide) {
    $provide.decorator('$exceptionHandler',
        ['$delegate', 'config', 'logger', extendExceptionHandler]);
}]);

// Extend the $exceptionHandler service to also display a toast.
function extendExceptionHandler($delegate, config, logger) {
    var appErrorPrefix = config.appErrorPrefix;
    var logError = logger.getLogFn('app', 'error');
    return function (exception, cause) {
        $delegate(exception, cause);
        if (exception.status == 401) {
            window.location.href = "/UserAccount/Home";
        }
        if (exception.message == "undefined") { return; }
        if (appErrorPrefix && exception.message.indexOf(appErrorPrefix) === 0) { return; }

        var errorData = { exception: exception, cause: cause };
        var msg = appErrorPrefix + exception.message;
        logError(msg, errorData, true);
    };
}

})();

修改了BreezeController.cs以生成401错误,如下所示:

[AttributeUsageAttribute(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : System.Web.Http.Filters.AuthorizationFilterAttribute
{
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        base.OnAuthorization(actionContext);

        ////check authentication and return if not authorized
        if (actionContext != null)
        {
            if (!actionContext.RequestContext.Principal.Identity.IsAuthenticated)
            {
            actionContext.Response = 
                new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized) { RequestMessage = actionContext.ControllerContext.Request };
            }
        }
    }
}

控制器中的条目被赋予[Authorize]属性以捕获任何未经授权的访问,如下所示:

    [System.Web.Http.HttpGet]
    [ValidateAntiForgeryToken]
    [Authorize]
    public string Metadata()
    {
    return _repository.Metadata;
    }

它可能很脏,但它可以解决问题。