使用Azure移动应用程序对Nancy进行身份验证

时间:2017-03-03 23:27:29

标签: azure azure-mobile-services

我看到我可以将Nancy添加到我的Azure移动应用程序中。 http://www.strathweb.com/2014/02/running-owin-pipeline-new-net-azure-mobile-services/但是如何为Nancy添加身份验证?这里的目标是能够使用同一台服务器同时拥有一个Web应用程序和一个移动应用程序。

目标:如果Nancy页面需要身份验证,请跳转到〜/ .auth / login / aad(例如),然后返回到原始页面。

我在哪里:

  1. 创建新的Azure移动应用程序ASP.NET应用程序
  2. 添加Nancy
  3. 删除默认的MobileAppConfig并替换为

        new MobileAppConfiguration()
            .MapApiControllers()
            .AddTables(
                new MobileAppTableConfiguration()
                    .MapTableControllers()
                    .AddEntityFramework()
            )
            .AddPushNotifications()
            .MapLegacyCrossDomainController()
            .ApplyTo(config);
    
  4. 创建一个IndexModule并确认Nancy正常工作

    public IndexModule()
    {
        Get["/"] = _ => "Hello";
    }
    
  5. 创建一个AdminModule,在安装Nancy.Authentication.Forms后出现RequiresAuthentication

    public AdminModule()
        : base("admin")
    {
        Get["/"] = _ =>
        {
            this.RequiresAuthentication();
            return "This is admin";
        };
    }
    
  6. 可能做错了,但我有

    protected override void ConfigureRequestContainer(TinyIoCContainer container, NancyContext context)
    {
        base.ConfigureRequestContainer(container, context);
        container.Register<IUserMapper, UserMapper>();
    }
    
    protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context)
    {
        base.RequestStartup(container, pipelines, context);
    
        var formsAuthConfig = new FormsAuthenticationConfiguration
        {
            RedirectUrl = "~/.auth/login/aad",
            UserMapper = container.Resolve<IUserMapper>(),
        };
    
        FormsAuthentication.Enable(pipelines, formsAuthConfig);
    }
    
  7. 这会将用户发送到正确的身份验证页面,但是当zumo返回时(1)返回带令牌的回调,(2)提供指向“网站”的链接,该网站是主站点,而不是returnUrl, (3)仍然没有真正奏效。

    更新。看起来像Nancy.Forms.Authentication是一个关于此问题的deadend。我可以使用Owin.Security的UseCookieAuthentication吗?

    Update2。我摆脱了Nancy.Forms.Authentication。看起来当Zumo完成身份验证时,owin server.user实际上已经设置好了。

        protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
        {
            base.ApplicationStartup(container, pipelines);
    
            Csrf.Enable(pipelines);
            pipelines.BeforeRequest.AddItemToStartOfPipeline(FlowPrincipal);
        }
    
        private Response FlowPrincipal(NancyContext context)
        {
            var env = Get<IDictionary<string, object>>(context.Items, NancyMiddleware.RequestEnvironmentKey);
            if (env != null)
            {
                var principal = Get<IPrincipal>(env, "server.User") as ClaimsPrincipal;
                if (principal != null)
                {
                    context.CurrentUser = new ClaimsPrincipalUserIdentity(principal);
                }
            }
    
            return null;
        }
    

    将提供有效的可用用户。如何触发登录和重定向是另一个问题。

    Update3。我可以使用Azure中的设置强行登录

    enter image description here

    令人惊讶的是,这也照顾了重定向。不确定它如何影响SignalR / Zumo表,但希望它能够检查标题而不强制登录。

1 个答案:

答案 0 :(得分:1)

您引用的博客文章适用于Azure移动服务,而非Azure移动应用程序。

查看我的书的第6章 - http://aka.ms/zumobook。它明确地向您展示了如何处理各种平台的App Service身份验证。 Nancy并不是其中之一,但MVC版本可以帮助你。