gpt4 book ai didi

oauth - 如何管理我的 WorldDomination 和 Nancy 身份验证?

转载 作者:行者123 更新时间:2023-12-04 05:39:43 24 4
gpt4 key购买 nike

我正在尝试让社交身份验证在 asp.net 托管的 Nancy 中工作使用 WorldDomination SimpleAuthentication plugin for Nancy 的网络应用程序. TL;DR 跳到问题底部加粗的问题。

两者都非常好,但是在身份验证过程(很好地涵盖)和在请求期间识别经过身份验证的用户之间存在很大的文档差距,而不是初始身份验证请求(什么都没有)。

Nancy 通过附加包提供基本和表单例份验证,它们提供的钩子(Hook)非常简单。 WorldDomination 在实际身份验证过程之后没有提供太多信息。对于每次用户访问服务器时必须发生的正常“谁是发出此请求的用户”过程,似乎明显缺乏快乐路径。

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

我最好的猜测是我需要与表单例份验证集成,实现南希的表单例份验证钩子(Hook),并使用我从 WD 获得的信息来填充我自己的类型。

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

究竟,将 WorldDomination 的社交 OAuth 身份验证提供程序和 Nancy 集成的推荐的快乐路径是什么? 我在这里专注于标准的“谁是请求我的人”页面生命周期部分。

奖励积分(来自我将为此目的创建的大量 sockpuppet 帐户)关于这条快乐路径如何处理用户注销!

最佳答案

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

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

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

我们可以自己处理整个表单例份验证场景,我实际上计划在 future 这样做。 (必须首先实现 claim ,我已经完成了 60%),但它仍然至少需要您实现 IAuthenticationCallbackProvider

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% 的时间用户进行身份验证,很可能已经有某种形式的身份验证。通常形成身份验证。

所以假设你已经引入了 SimpleAuthentication,并连接了你的 IAuthenticationCallbackProvider类(class)。您真正需要做的就是实现 Forms Auth 的东西,这几乎是 1 个类和一个方法调用。

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

然后你需要设置 IUserMapper类告诉南希如何从数据库中获取用户。如果您使用的是 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"
}
};
}
}
}

在 Bootstrap 中配置,如:
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);
}

真的是这样……

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

我希望通过消除对 Forms Auth 的需求,我们可以在 future 使 SimpleAuthentication 更加容易,但现在我认为我们有一个很好的解决方案。

有用的网址:

http://www.philliphaydon.com/2012/12/18/forms-authentication-with-nancyfx/

http://www.philliphaydon.com/2013/01/31/oauth-with-nancyfx-and-world-domination-authentication/

World Domination 的第二个链接,虽然有一些重命名,但基本相同。我确实计划在我们完成声明后更新博客文章并修改 wiki。

我希望这对你有帮助。

编辑:
  • 我已经记下要创建一个更端到端的解决方案演示项目。
  • 关于oauth - 如何管理我的 WorldDomination 和 Nancy 身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18047615/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com