Nancy MVC中的身份验证

本文关键字:身份验证 MVC Nancy | 更新日期: 2023-09-27 18:02:35

我使用第三方身份验证过程来授权我在Nancy中的页面。我曾尝试在MVC中这样做,它是成功的,但我不能在南希重现相同的结果。

这是我正在做的: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"; }
        }
    }
}

现在这是我的程序。cs只给南希:

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;
            }
        }
}

现在我所要做的就是在我的Nancy模块上写[authorization],它应该像MVC一样工作。

mvc控制器:

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];
            };
        }
    }
}

当我浏览到页面后运行MVC应用程序运行成功,授权工作成功,但南希没有显示任何东西。我试过使用this.RequiresAuthentication();但是它抛出了一个异常:Nancy-Exception

只是提到我不知道第三方身份验证过程是如何工作的,我只能使用它。在MVC我已经收到了样本,它是正常工作的,为什么它不工作相同的南希。

Nancy MVC中的身份验证

Nancy没有使用[authorization]属性。下面是使用Identity server进行Nancy特定实现的示例。

如果你只是在使用Nancy,试着用这个来替换你的两个startup(使用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);
        }
    }
}

在你的NancyBootstrapper(这里是你可以重定向用户到登录页面的地方):公共类NBootstrapper: DefaultNancyBootstrapper{//Nancy Bootstrapper覆盖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);
    }
}

然后你可以使用:

this.RequiresMSOwinAuthentication();

在你的模块。希望这对你有帮助!我的问题是试图也得到相同的身份验证南希内部和外部工作太,与SignalR…