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

tof*_*tim 6 azure azure-mobile-services

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

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

我在哪里:

  1. 创建了新的Azure Mobile App ASP.NET应用程序
  2. 添加南希
  3. 删除默认的MobileAppConfig并替换为

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

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

    public AdminModule()
        : base("admin")
    {
        Get["/"] = _ =>
        {
            this.RequiresAuthentication();
            return "This is admin";
        };
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

这会将用户发送到正确的auth页面,但是当zumo返回它时(1)返回带有令牌的回调,并且(2)提供指向作为主站点的"网站"的链接,而不是returnUrl和(3) )仍然没有真正起作用.

更新.看起来像Nancy.Forms.Authentication是一个deadend.我可以使用UseCookieAuthenticationOwin.Security吗?

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;
    }
Run Code Online (Sandbox Code Playgroud)

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

UPDATE3.我能够使用Azure中的设置强制登录

在此输入图像描述

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

Adr*_*all 1

您引用的博客文章适用于 Azure 移动服务,而不是 Azure 移动应用。

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