如何使用 NancyFx 和 IdentityServer3(非 API 网站)设置基于 cookie 的身份验证

How to set up cookie based authentication with NancyFx and IdentityServer3 (non-API website)

我们的环境如下:

...现在我们要开始添加一个 OWIN 托管的 Web 应用程序,它将使用 NancyFx 来提供服务器呈现的页面以及几个 AngularJS SPA。 Nancy 网站不会托管任何 API,但可能会使用我们现有 API 的数据。我想在 OWIN 管道中添加身份验证,以帮助确保我们的 Angular 应用程序不会被发送给没有访问权限的用户。

这与发送 SPA 代码形成对比,并让 Angular 确定用户是否应该看到任何内容。在这种情况下,我们已经公开了 javascript 代码库,我们希望避免这种情况。

我正在尝试了解应该如何配置此 Nancy 站点以使用隐式流程根据 IdentityServer 对用户进行身份验证。我之前在独立的 SPA 中实现了这种身份验证方案(其中所有身份验证都由 AngularJS 代码处理,令牌存储在 HTML5 本地存储中),但我对如何正确处理有点迷茫这在 OWIN 管道中。

我认为 OWIN cookie 身份验证中间件就是答案,但这是否意味着以下内容?

...还是我的想法全错了?

作为参考,我通读了以下帖子,它们非常有帮助,但我不太了解 OWIN 的全局。接下来我将尝试使用 UseOpenIdConnectAuthentication 中间件,但我将不胜感激这里可能提供的任何指导。

http://brockallen.com/2013/10/24/a-primer-on-owin-cookie-authentication-middleware-for-the-asp-net-developer/

https://github.com/IdentityServer/IdentityServer3/issues/487

从根本上说,在通过 OWIN 托管的 Nancy 应用程序中实现 OpenID Connect 身份验证与在任何 MVC/Katana 应用程序中实现它确实没有什么不同(Thinktecture 团队有一个针对此场景的示例:https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source/Clients/MVC%20OWIN%20Client

您基本上需要 3 个东西:cookie 中间件、OpenID Connect 中间件和 Nancy 中间件:

public class Startup {
    public void Configuration(IAppBuilder app) {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions {
            AuthenticationMode = AuthenticationMode.Active,
            AuthenticationType = CookieAuthenticationDefaults.AuthenticationType
        });

        app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions {
            AuthenticationMode = AuthenticationMode.Active,

            // Set the address of your OpenID Connect server:
            Authority = "http://localhost:54541/"

            // Set your client identifier here:
            ClientId = "myClient",

            // Set the redirect_uri and post_logout_redirect_uri
            // corresponding to your application:
            RedirectUri = "http://localhost:56765/oidc",
            PostLogoutRedirectUri = "http://localhost:56765/"
        });

        app.UseNancy(options => options.PerformPassThrough = context => context.Response.StatusCode == HttpStatusCode.NotFound);
    }
}

如果您正在寻找功能演示,可以查看 https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/tree/dev/samples/Nancy/Nancy.Client(注意:OIDC 服务器部分不使用 IdentityServer3,但对客户端应用程序)。