【问题标题】:Thinktecture IdentityModel AuthenticationConfiguration Mapping for Cookie - how?Thinktecture IdentityModel AuthenticationConfiguration Mapping for Cookie - 如何?
【发布时间】:2013-08-03 04:21:27
【问题描述】:

我目前使用令人惊叹的 Thinktecture IdentityModel 4.5 设置了一个基于 Web API 的应用程序。

它是为基于声明的身份验证设置的,接受在 Authorization 标头中发送的基本身份验证凭据。 javascript 客户端保存返回的会话令牌并将其用于后续请求,方法是将其包含在 Authorization 标头中,前面是 Session 作为方案。

javascript 客户端还将令牌保存到 cookie 中,以便在窗口关闭并快速重新打开时进行检索,或者在打开新窗口时进行检索,以防止用户必须重新进行身份验证。 cookie 被命名为 sessionToken,它的值是实际的令牌。

这一切都非常好。

问题是我在应用程序页面上有一个链接,该链接链接到直接地址(/api/controller/id/pdfdocument)并在新窗口中打开它(目标:_blank)。因此,无法在此请求中包含 Authorization 标头。但是,由于会话仍处于活动状态,因此 cookie 会正确传输。

我已尝试向 AuthenticationConfig.Mappings 集合添加映射以添加对从 cookie 收集令牌的支持,但是我无法正确配置以使其正常工作,并且无法找到任何其他在线资源。我假设有一些非常简单的问题需要修复。

我的代码:

    private static AuthenticationConfiguration CreateAuthenticationConfiguration()
    {
        var sessionTokenConfiguration = new SessionTokenConfiguration();
        sessionTokenConfiguration.EndpointAddress = "/Authenticate";
        sessionTokenConfiguration.DefaultTokenLifetime = new TimeSpan(1, 0, 0);

        var authenticationConfig = new AuthenticationConfiguration
        {
            ClaimsAuthenticationManager = _authenticationManager,
            RequireSsl = false,
            EnableSessionToken = true,
            SessionToken = sessionTokenConfiguration,
            SendWwwAuthenticateResponseHeaders = false
        };

        var securityTokenHandler = new Thinktecture.IdentityModel.Tokens.Http.BasicAuthenticationWithRoleSecurityTokenHandler(_userService.ValidateUser, _userService.GetRolesForUser);
        securityTokenHandler.RetainPassword = false;
        var realm = "localhost";

        var authorizationMapping = new AuthenticationOptionMapping
        {
            Options = AuthenticationOptions.ForAuthorizationHeader(scheme: "Basic"),
            TokenHandler = new System.IdentityModel.Tokens.SecurityTokenHandlerCollection { securityTokenHandler },
            Scheme = AuthenticationScheme.SchemeAndRealm("Basic", realm)
        };
        authenticationConfig.AddMapping(authorizationMapping);

        var cookieMapping = new AuthenticationOptionMapping
        {
            Options = AuthenticationOptions.ForCookie("sessionToken"),
            TokenHandler = new System.IdentityModel.Tokens.SecurityTokenHandlerCollection { securityTokenHandler },
            Scheme = AuthenticationScheme.SchemeOnly(scheme: "Session")
        };
        authenticationConfig.AddMapping(cookieMapping);

        //authenticationConfig.AddBasicAuthentication(_userService.ValidateUser, _userService.GetRolesForUser);

        return authenticationConfig;
    }

然后像这样应用此配置:

HttpConfiguration config;
var authenticationConfig = CreateAuthenticationConfiguration();
config.MessageHandlers.Add(new AuthenticationHandler(authenticationConfig));

这就是请求标头中 cookie 的样子:

Cookie: sessionToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjEzNzM2NDA5NjgsImlzcyI6InNlc3Npb24gaXNzdWVyIiwiYXVkIjoiaHR0cDovL3Nlc3Npb24udHQvIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6ImEiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL2F1dGhlbnRpY2F0aW9ubWV0aG9kIjoiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2F1dGhlbnRpY2F0aW9ubWV0aG9kL3Bhc3N3b3JkIiwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2NsYWltcy9hdXRoZW50aWNhdGlvbmluc3RhbnQiOiIyMDEzLTA3LTEyVDEzOjU2OjA4LjA5N1oiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJBZG1pbmlzdHJhdG9yIiwiSWQiOiIyIn0.UlPeD9HzduQfwHE7NuXi9eMVo40hypi_LBK-f76VYFI; username=a

非常感谢任何帮助!

【问题讨论】:

标签: asp.net-web-api thinktecture-ident-model


【解决方案1】:

所以在等待了几分钟并且没有收到任何回复并且迫切需要此功能后,我潜入 Thinktecture IdentityModel 4.5 源代码以查看发生了什么,但似乎实际上并不支持此功能。不仅不支持,而且从外观上看 cookie 映射实际上并没有实现。

我分叉了存储库并进行了一些小的更改以支持此功能: https://github.com/ibraheemhlaiyil/Thinktecture.IdentityModel.45

并在拉取请求中向 Thinktecture 的 Dominick Baier 发送了这个: https://github.com/thinktecture/Thinktecture.IdentityModel.45/pull/95

Cookie 的使用有它的缺点,Thinktecture 似乎试图尽可能远离它们,但是我无法为我的问题提出不同的解决方案 - 需要打开一个新的 javascript 客户端 Web 应用程序窗口/选项卡并在新窗口/选项卡中维护经过身份验证的会话。

如果您想使用此功能,您只需在SessionTokenConfiguration 对象上设置新的CookieName 属性。 IdentityModel 使用HeaderName 属性来确定要查找哪个标头以查找身份验证数据。同样,如果设置了CookieName 属性,则在未在标头上找到身份验证数据时,这将确定为身份验证数据查找哪个 cookie 名称。

在下面的示例中,如果在 Authorization 标头上没有找到身份验证数据,则会在名为 sessionToken 的 cookie 上查找身份验证数据。

    private static AuthenticationConfiguration CreateAuthenticationConfiguration()
    {

        var authenticationConfig = new AuthenticationConfiguration
        {
            ClaimsAuthenticationManager = _authenticationManager,
            RequireSsl = false,
            SendWwwAuthenticateResponseHeaders = false,
            EnableSessionToken = true,
            SessionToken = new SessionTokenConfiguration
            {
                EndpointAddress = "/Authenticate",
                DefaultTokenLifetime = new TimeSpan(1, 0, 0),
                HeaderName = "Authorization",
                CookieName = "sessionToken",
                SigningKey = CryptoRandom.CreateRandomKey(32)
            }
        };

        authenticationConfig.AddBasicAuthentication(_userService.ValidateUser, _userService.GetRolesForUser);

        return authenticationConfig;
    }

和以前一样,在您的应用程序启动期间应用此配置:

HttpConfiguration config;
var authenticationConfig = CreateAuthenticationConfiguration();
config.MessageHandlers.Add(new AuthenticationHandler(authenticationConfig));

cookie 身份验证数据与 Authorization 标头中发送的数据具有完全相同的形式,因此如果发送,cookie 应如下所示:

Cookie: sessionToken=Session eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjEzNzM2NDA5NjgsImlzcyI6InNlc3Npb24gaXNzdWVyIiwiYXVkIjoiaHR0cDovL3Nlc3Npb24udHQvIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6ImEiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL2F1dGhlbnRpY2F0aW9ubWV0aG9kIjoiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2F1dGhlbnRpY2F0aW9ubWV0aG9kL3Bhc3N3b3JkIiwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2NsYWltcy9hdXRoZW50aWNhdGlvbmluc3RhbnQiOiIyMDEzLTA3LTEyVDEzOjU2OjA4LjA5N1oiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJBZG1pbmlzdHJhdG9yIiwiSWQiOiIyIn0.UlPeD9HzduQfwHE7NuXi9eMVo40hypi_LBK-f76VYFI

希望有人发现这个有用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2015-08-16
    • 2023-04-02
    • 2014-03-25
    相关资源
    最近更新 更多