每路线NancyFx认证(NancyFx Authentication per Route)

2019-07-31 06:37发布

从我在源代码RequiresAuthentication(SAW)确实为整个模块认证检查。 有没有什么办法,以每条航线做到这一点?

Answer 1:

我有同样的问题。 然而事实证明了RequiresAuthentication工作在两个模块级和路径级。 为了演示,这里是一些代码撕去了我的当前项目(省略其显示的所有路线)。

public class RegisterModule : _BaseModule
{
    public RegisterModule() : base("/register")
    {
        Get["/basic-details"] = _ => View["RegisterBasicDetailsView", Model];

        Get["/select"] = _ =>
            {
                this.RequiresAuthentication();
                return View["RegisterSelectView", Model];
            };
    }
}

当然有做这种方式唯一的问题是,所有的模块中的保护路径需要调用RequiresAuthentication 。 在我上面的模块的情况下,我还有一个5条航线(未显示),所有这些都需要保护,这样就使得致电6个RequiresAuthentication ,而不是一个在模块级。 另一种方法是把未受路线拉进另一个模块,但我的判断是,模块的增殖比另外RequiresAuthentication通话更糟糕。



Answer 2:

namespace Kallist.Modules {

    #region Namespaces

    using System;
    using Nancy;

    #endregion

    public static class ModuleExtensions {

        #region Methods

        public static Response WithAuthentication(this NancyModule module, Func<Response> executeAuthenticated) {
            if ((module.Context.CurrentUser != null) && !string.IsNullOrWhiteSpace(module.Context.CurrentUser.UserName)) {
                return executeAuthenticated();
            }
            return new Response { StatusCode = HttpStatusCode.Unauthorized };
        }

        #endregion

    }
}


Answer 3:

我遇到同样的问题,这里是我如何解决它。

        var module = new MyModule();
        module.AddBeforeHookOrExecute(context => null, "Requires Authentication");
        _browser = new Browser(with =>
            {
                with.Module(module);
                with.RequestStartup((container, pipelines, ctx) =>
                    {
                        ctx.CurrentUser = new User { UserId = "1234", UserName = "test"};
                    });
            });

我现在可以在模块级使用this.RequiresAuthentication(),然后运行我的单元测试。



文章来源: NancyFx Authentication per Route