使用简单身份验证,我们只需以简单的方式处理与提供者的身份验证。每个提供者都有略微不同的实现、不同的命名、不同的承诺,因此我们可以将所有这些整合到简单身份验证中,并使开发人员更容易在他们的网站中实现。
这就是 Nancy.SimpleAuthentication 包存在的原因。因为我们知道 Nancy 是如何工作的,所以我们通过创建模块来简化与 Nancy 的集成,以便您处理重定向、身份验证回调等。
问题是,我们根本不知道您是如何针对您的网站对用户进行身份验证的。
我们可以自己处理整个表单身份验证场景,我实际上计划在未来这样做。(必须首先实施索赔,我已经完成了 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
类。您真正需要做的就是实现 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"
}
};
}
}
}
在引导程序中配置,如:
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 的需求,我们可以在未来使 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。
我希望这对你有帮助。
编辑: