Oauth 我如何管理与WorldDomination和Nancy的身份验证?

Oauth 我如何管理与WorldDomination和Nancy的身份验证?,oauth,forms-authentication,nancy,simple-authentication,Oauth,Forms Authentication,Nancy,Simple Authentication,我正在尝试在asp.net托管的web应用程序中使用。TL;DRs跳到问题底部粗体的问题 这两种方法都很不错,但是在身份验证过程(涵盖范围很广)和在除了初始身份验证请求(无)之外的请求期间识别身份验证用户之间存在很大的文档差距 Nancy通过附加的包提供基本和表单身份验证,它们提供的钩子非常简单。WorldDomination在实际的身份验证过程中没有提供太多信息。对于正常的“谁是发出此请求的用户”过程来说,似乎明显缺乏愉快的路径,而这一过程必须在用户每次点击服务器时发生 我已经花了相当多的时间

我正在尝试在asp.net托管的web应用程序中使用。TL;DRs跳到问题底部粗体的问题

这两种方法都很不错,但是在身份验证过程(涵盖范围很广)和在除了初始身份验证请求(无)之外的请求期间识别身份验证用户之间存在很大的文档差距

Nancy通过附加的包提供基本和表单身份验证,它们提供的钩子非常简单。WorldDomination在实际的身份验证过程中没有提供太多信息。对于正常的“谁是发出此请求的用户”过程来说,似乎明显缺乏愉快的路径,而这一过程必须在用户每次点击服务器时发生

我已经花了相当多的时间来理解这一部分,但我的研究并没有让我找到任何明显的解决方案。WD演示应用程序中除了身份验证请求之外,没有任何请求代码,代码库中似乎也没有任何处理正常请求周期的内容

我最好的猜测是,我需要与forms auth集成,实现Nancy的forms auth挂钩,并使用从WD获得的信息填充我自己的类型

这似乎不是最幸福的幸福之路。事实上,这似乎更像是一条“做很多工作,你这个懒惰的混蛋”的道路

整合WorldDomination的社交OAuth身份验证提供商和Nancy的推荐快乐之路到底是什么?我在这里集中讨论标准的“谁是向我提出请求的人”页面生命周期部分


奖励积分(从我的sockpuppet帐户群中,我将为此目的创建)用于说明此快乐路径如何处理用户注销

使用简单身份验证,我们只需以简单的方式处理与提供者的身份验证。每个提供商都有稍微不同的实现、不同的命名和不同的承诺,因此我们可以将所有这些整合到简单的身份验证中,并使开发人员更容易在其网站中实现

这就是Nancy.SimpleAuthentication包存在的原因。因为我们知道Nancy是如何工作的,所以通过为您创建模块来处理重定向、身份验证回调等,我们简化了与Nancy的集成

问题是,我们根本不知道如何根据您的网站对用户进行身份验证

我们可以自己处理整个forms auth场景,我实际上计划在将来处理。(必须首先实现声明,我已经完成了60%),但它至少需要您实现
IAAuthenticationCallbackProvider

public class Test : IAuthenticationCallbackProvider
{
    public dynamic Process(
        NancyModule nancyModule, 
        AuthenticateCallbackData model)
    {
        //Query for the database user based on the Provider / Id
        //Authenticate the user
        //Call LoginWithoutRedirect, and redirect how you want...
        //  or LoginWithRedirect

        return nancyModule.Negotiate.WithView("AuthenticateCallback")
            .WithModel(model);
    }
}
该类是必需的,以便根据数据库对用户进行身份验证

我们认为95%的时间里用户都在进行身份验证,很可能已经有了某种形式的身份验证。通常形成Auth


因此,假设您引入了SimpleAuthentication,并连接了
IAAuthenticationCallbackProvider
类。您真正需要做的就是实现Forms Auth,它几乎是一个类和一个方法调用

在提供程序中,您需要调用
LoginWithoutRedirect
方法,以便Nancy可以创建身份验证cookie

然后需要设置
IUserMapper
类,告诉Nancy如何从数据库中获取用户。如果您使用的是RavenDB,这将类似于:

public class DatabaseUser : IUserMapper
{
    public IDocumentStore DocumentStore { get; set; }
    public DatabaseUser(IDocumentStore documentStore)
    {
        DocumentStore = documentStore;
    }

    public IUserIdentity GetUserFromIdentifier(
        Guid identifier, 
        NancyContext context)
    {
        using (var session = DocumentStore.OpenSession())
        {
            var member = session.Query<Member>()
                .SingleOrDefault(x => x.Identifier == identifier);

            if (member == null)
                return null;

            return new UserIdentity
            {
                UserName = member.DisplayName,
                Claims = new []
                {
                    "NewUser",
                    "CanComment"
                }
            };
        }
    }
}
公共类数据库用户:IUserMapper
{
公共IDocumentStore DocumentStore{get;set;}
公共数据库用户(IDocumentStore documentStore)
{
DocumentStore=DocumentStore;
}
公共IUserIdentity GetUserFromIdentifier(
Guid标识符,
NancyContext(上下文)
{
使用(var session=DocumentStore.OpenSession())
{
var member=session.Query()
.SingleOrDefault(x=>x.Identifier==Identifier);
if(成员==null)
返回null;
返回新的用户标识
{
用户名=member.DisplayName,
索赔=新[]
{
“新用户”,
“癌症”
}
};
}
}
}
在引导程序中配置,如:

protected override void ConfigureRequestContainer(
    TinyIoCContainer container,
    NancyContext context)
{
    base.ConfigureRequestContainer(container, context);
    container.Register<IUserMapper, DatabaseUser>();
}
protected override void RequestStartup(
    TinyIoCContainer container, 
    IPipelines pipelines, 
    NancyContext context)
{
    base.RequestStartup(container, pipelines, context);

    var formsAuthConfiguration = new FormsAuthenticationConfiguration
    {
        RedirectUrl = "~/login",
        UserMapper = container.Resolve<IUserMapper>(),
    };

    FormsAuthentication.Enable(pipelines, formsAuthConfiguration);
}
protected override void ConfigureRequestContainer(
Tinyioch集装箱,
NancyContext(上下文)
{
ConfigureRequestContainer(容器、上下文);
container.Register();
}
受保护的覆盖无效请求启动(
Tinyioch集装箱,
伊庇佩林管道,
NancyContext(上下文)
{
base.RequestStartup(容器、管道、上下文);
var formsAuthConfiguration=新的FormsAuthenticationConfiguration
{
重定向URL=“~/login”,
UserMapper=container.Resolve(),
};
FormsAuthentication.Enable(管道、formsAuthConfiguration);
}
就这样

我个人认为你不需要写很多代码。Nancy和Simple Authentication都为您完成了大部分腿部工作:)

我希望通过消除表单身份验证的需要,我们可以使SimpleAuthentication在将来变得更加容易,但是现在我认为我们有一个非常好的解决方案

有用链接:

统治世界的第二个环节,虽然有一些更名,但基本上是一样的。我确实计划在完成声明后更新一篇博文并修改维基

我希望这对你有帮助

编辑:

  • 我已经记下创建一个更端到端的解决方案演示项目
哇,brb,创造了一大群袜子。非常感谢。这很好地回答了这个问题。我是简单的身份验证手动设置,因为我有不同的注册和登录回调URL。但我正在经历一场灾难