Zeeshan Shafqat
Zeeshan Shafqat

Reputation: 11

Authentication in Nancy MVC

I am using a third party authentication procedure to authorize my pages in Nancy. I have tried to do it in MVC and it is successfull but I cannot reproduce the same results in Nancy.

Here is what I am doing: MVC-Startup:

using Microsoft.Owin;
using Owin;
using Passport.Auth;

[assembly: OwinStartup(typeof(TestAuthorization.Startup))]
namespace TestAuthorization
{
    public partial class Startup:StartupBase
    {
        public void Configuration(IAppBuilder app)
        {
            base.Configuration(app);
        }
        public override string IdentityServerUri
        {
            get { return "https://test.ThirdParty.URL/identity"; }
        }
        public override string RedirectUri
        {
            get { return "https://localhost:4443"; }
        }
        public override string ApplicationClientId
        {
            get { return "local.fox.company"; }
        }
    }
}

Nancy-Startup:

using Microsoft.Owin;
using Owin;
using Passport.Auth;
using Nancy.Owin;
[assembly: OwinStartupAttribute(typeof(AgreementManagementTool.Startup))]
namespace AgreementManagementTool
{
    public class Startup: StartupBase
    {
         public void Configuration(IAppBuilder app)
         {
            app.UseNancy();
            base.Configuration(app);
         }
        public override string IdentityServerUri
        {
            get { return "https://test.ThirdParty.URL/identity"; }
        }
        public override string RedirectUri
        {
            get { return "https://localhost:4443"; }
        }
        public override string ApplicationClientId
        {
            get { return "local.fox.company"; }
        }
    }
}

Now here is my program.cs for Nancy only:

class Program
{
        static void Main(string[] args)
        {
            var uri = "https://+:4443"; //"https://localhost:4443";
            Console.WriteLine("Starting Nancy on " + uri);

            using (WebApp.Start<Startup>(uri))
            {
                Console.WriteLine("\n\nServer listening at {0}. Press enter to stop", uri);
                Console.ReadLine();
                return;
            }
        }
}

Now all I have to do is write [Authorize] on top of my Nancy module and it should work just like MVC.

MVC-Controller:

using System.Web.Mvc;

namespace TestAuthorization.Controllers
{
    [Authorize]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
           //this.RequiresMSOwinAuthentication();
            return View();
        }
    }
}

Nancy-Module:

using Nancy;
using AgreementManagementTool.Views.Home.Model;
using System.Web.Mvc;

namespace AgreementManagementTool.Modules
{
    [Authorize]
    public class HomeModule : NancyModule
    {
        public HomeModule()
            : base("/home")
        {
            Get["/"] = parameters =>
            {
                //this.RequiresMSOwinAuthentication(); // Not working
                //this.RequiresAuthentication(); // Not working
                HomeModel result = new HomeModel();
                result.ResultImport = "I am testing AUthentication";
                return View["index", result];
            };

        }
    }
}

When I browse to the page after running the MVC application run successfully and authorization work successfull, but nancy doesnot show anything. I have tried to use this.RequiresAuthentication(); but it throws an exception: Nancy-Exception

Just to mention that I have no idea how the third party authentication process works, I just have to use it. In MVC I have recieved the sample and it is working fine, why is it not working the same in nancy.

Upvotes: 1

Views: 921

Answers (2)

John P
John P

Reputation: 1

If you are just using Nancy, try this to replace both your startups (using Owin.Security.Cookies):

using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;

namespace TestOwin
{
    public class Startup
    {
        // OWIN Configuration goes here
        public static void Configuration(IAppBuilder app)
        {
            var cookieOptions = new CookieAuthenticationOptions() { AuthenticationMode = AuthenticationMode.Active };
            var nancyCfg = new NancyOptions();
            nancyCfg.Bootstrapper = new NBootstrapper();
            app.UseStaticFiles();
            app.UseCookieAuthentication(cookieOptions);
            app.UseNancy(nancyCfg);

        }

    }
}

And in your NancyBootstrapper (Here is where you can redirect users to a login page): public class NBootstrapper : DefaultNancyBootstrapper { //Nancy Bootstrapper overrides go here

    protected override void ConfigureApplicationContainer(TinyIoCContainer container)
    {
        // We don't call "base" here to prevent auto-discovery of
        // types/dependencies
    }
    protected override void ConfigureRequestContainer(TinyIoCContainer container, NancyContext context)
    {
        base.ConfigureRequestContainer(container, context);

        // Here we register our user mapper as a per-request singleton.
        // As this is now per-request we could inject a request scoped
        // database "context" or other request scoped services.
        container.Register<IUserMapper, UserValidator>();
    }

    protected override void RequestStartup(TinyIoCContainer requestContainer, IPipelines pipelines, NancyContext context)
    {
        // At request startup we modify the request pipelines to
        // include forms authentication - passing in our now request
        // scoped user name mapper.
        //
        // The pipelines passed in here are specific to this request,
        // so we can add/remove/update items in them as we please.
        var formsAuthConfiguration =
            new FormsAuthenticationConfiguration()
            {
                RedirectUrl = "~/login",
                UserMapper = requestContainer.Resolve<IUserMapper>(),
            };

        FormsAuthentication.Enable(pipelines, formsAuthConfiguration);
    }

}

And then you can use:

this.RequiresMSOwinAuthentication();

on your modules. Hope this helps! My problem is trying to also get the same authentication to work inside Nancy and outside too, with SignalR...

Upvotes: 0

Sifiso Shezi
Sifiso Shezi

Reputation: 486

Nancy does not use [Authorize] attribute. Have a look sample using Identity server for Nancy specific implementation.

Upvotes: 1

Related Questions