Oauth 我如何管理与WorldDomination和Nancy的身份验证?
我正在尝试在asp.net托管的web应用程序中使用。TL;DRs跳到问题底部粗体的问题 这两种方法都很不错,但是在身份验证过程(涵盖范围很广)和在除了初始身份验证请求(无)之外的请求期间识别身份验证用户之间存在很大的文档差距 Nancy通过附加的包提供基本和表单身份验证,它们提供的钩子非常简单。WorldDomination在实际的身份验证过程中没有提供太多信息。对于正常的“谁是发出此请求的用户”过程来说,似乎明显缺乏愉快的路径,而这一过程必须在用户每次点击服务器时发生 我已经花了相当多的时间来理解这一部分,但我的研究并没有让我找到任何明显的解决方案。WD演示应用程序中除了身份验证请求之外,没有任何请求代码,代码库中似乎也没有任何处理正常请求周期的内容 我最好的猜测是,我需要与forms auth集成,实现Nancy的forms auth挂钩,并使用从WD获得的信息填充我自己的类型 这似乎不是最幸福的幸福之路。事实上,这似乎更像是一条“做很多工作,你这个懒惰的混蛋”的道路 整合WorldDomination的社交OAuth身份验证提供商和Nancy的推荐快乐之路到底是什么?我在这里集中讨论标准的“谁是向我提出请求的人”页面生命周期部分Oauth 我如何管理与WorldDomination和Nancy的身份验证?,oauth,forms-authentication,nancy,simple-authentication,Oauth,Forms Authentication,Nancy,Simple Authentication,我正在尝试在asp.net托管的web应用程序中使用。TL;DRs跳到问题底部粗体的问题 这两种方法都很不错,但是在身份验证过程(涵盖范围很广)和在除了初始身份验证请求(无)之外的请求期间识别身份验证用户之间存在很大的文档差距 Nancy通过附加的包提供基本和表单身份验证,它们提供的钩子非常简单。WorldDomination在实际的身份验证过程中没有提供太多信息。对于正常的“谁是发出此请求的用户”过程来说,似乎明显缺乏愉快的路径,而这一过程必须在用户每次点击服务器时发生 我已经花了相当多的时间
奖励积分(从我的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在将来变得更加容易,但是现在我认为我们有一个非常好的解决方案
有用链接:
统治世界的第二个环节,虽然有一些更名,但基本上是一样的。我确实计划在完成声明后更新一篇博文并修改维基
我希望这对你有帮助
编辑:
- 我已经记下创建一个更端到端的解决方案演示项目李>