OWIN托管的Nancy模块调用RequiresAuthentication发送回401

时间:2013-07-08 14:18:05

标签: nancy owin katana

我有一个像这样的南希模块。

public class HomeModule : NancyModule
{
    public HomeModule()
    {
        this.RequiresAuthentication();

        var context = this.Context; // this is null

        Get["/"] = x =>
        {
            return "Hello";
        };
    }
}

OWIN中间件将User对象的OwinRequest属性设置为具有身份验证身份的ClaimsPrincipal。如果我在模块内部破坏并看到Thread.CurrentPrincipal,它会正确设置为我在中间件中设置的ClaimsPrincipal。然而,RequriesAuthentication发送回401.顺便说一下,模块内的上下文为空。我做错了什么?

我使用的一些感兴趣的NuGet软件包是

<package id="Microsoft.Owin" version="1.1.0-beta2" targetFramework="net45" />
<package id="Microsoft.Owin.Host.HttpListener" version="1.1.0-beta2" targetFramework="net45" />
<package id="Microsoft.Owin.Hosting" version="1.1.0-beta2" targetFramework="net45" />
<package id="Nancy" version="0.17.1" targetFramework="net45" />
<package id="Nancy.Owin" version="0.17.1" targetFramework="net45" />
<package id="Owin" version="1.0" targetFramework="net45" />

2 个答案:

答案 0 :(得分:1)

RequiresAuthentication基于Nancy IUserIdentity实现,那么您将需要另一种方法来验证您的ClaimsPrincipal身份。

请参阅此链接以获取一瞥: http://dhickey.ie/post/2014/01/04/Introducing-NancyMSOwinSecurity.aspx

这是代码: https://github.com/NancyFx/Nancy.MSOwinSecurity/blob/master/src/Nancy.MSOwinSecurity/NancyContextExtensions.cs

答案 1 :(得分:1)

路由中的Access Context属性,例如

Get["/"] = x => "hello " + this.Context.CurrentUser.UserName;

当前的Nancy auth系统基于IUserIdentity类型,但是OWIN类型是ClaimsPrinciple,所以你需要一些方法来做桥接事情,比如上面提到的包MsOwinSecurity。