libsaml 2.4.7 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +108 -2
- data/lib/saml/elements/requested_authn_context.rb +9 -1
- data/lib/saml/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6366380ef4896c6c119750e48f439ca0e03a5c4e
|
4
|
+
data.tar.gz: b953ecd1d5be90e167ca5a332f52cce0536d1bf1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f36839a1dd5ee94171d0f6078a30c1379b7756e8732e33a91828e7c880ff104db1d7f3926d406a2e9f8edaaa384c8a78db0ec03f6c6704ffffdfab2c249828f8
|
7
|
+
data.tar.gz: 884e2f549a8bcdb9f9af7ba8d28f1eb80890202b4cec3aa752c3f9a0883eeb5fd1146ff8442fa3665cb7d8b6ed9e5cca829575284810a38805d97653a41506fe
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
[](https://travis-ci.org/digidentity/libsaml)
|
2
2
|
[](https://coveralls.io/r/digidentity/libsaml)
|
3
3
|
[](https://codeclimate.com/github/digidentity/libsaml)
|
4
|
-
[](https://
|
4
|
+
[](https://gemnasium.com/digidentity/libsaml)
|
5
5
|
|
6
6
|
# libsaml
|
7
7
|
|
@@ -102,12 +102,33 @@ class SamlController < ApplicationController
|
|
102
102
|
|
103
103
|
authn_request = Saml::AuthnRequest.new(:destination => destination)
|
104
104
|
|
105
|
+
session[:authn_request_id] = auth_request._id
|
106
|
+
|
105
107
|
@saml_attributes = Saml::Bindings::HTTPPost.create_form_attributes(authn_request)
|
106
108
|
|
107
109
|
render text: @saml_attributes.to_yaml
|
108
110
|
end
|
109
111
|
|
110
112
|
def receive_response
|
113
|
+
if params["SAMLart"]
|
114
|
+
# provider should be of type Saml::Provider
|
115
|
+
@response = Saml::Bindings::HTTPArtifact.resolve(request, provider.artifact_resolution_service_url)
|
116
|
+
elsif params["SAMLResponse"]
|
117
|
+
@response = Saml::Bindings::HTTPost.receive_message(request, :response)
|
118
|
+
else
|
119
|
+
# handle invalid request
|
120
|
+
end
|
121
|
+
|
122
|
+
if @response && @response.success?
|
123
|
+
if session[:authn_request_id] == @response.in_response_to
|
124
|
+
@response.assertion.fetch_attribute('any_attribute')
|
125
|
+
else
|
126
|
+
# handle unrecognized response
|
127
|
+
end
|
128
|
+
reset_session # It's good practice to reset sessions after authenticating to mitigate session fixation attacks
|
129
|
+
else
|
130
|
+
# handle failure
|
131
|
+
end
|
111
132
|
end
|
112
133
|
end
|
113
134
|
```
|
@@ -117,10 +138,95 @@ Don't forget to define the routes in `config/routes.rb`:
|
|
117
138
|
```ruby
|
118
139
|
get "/saml/request_authentication" => "saml#request_authentication"
|
119
140
|
get "/saml/receive_response" => "saml#receive_response"
|
141
|
+
post "/saml/receive_response" => "saml#receive_response"
|
142
|
+
```
|
143
|
+
|
144
|
+
## Using libsaml as an IDP
|
145
|
+
|
146
|
+
Writing a solid identity provider really requires a deeper knowledge of the SAML protocol, so it's recommended to read more on the SAML 2.0 Wiki http://en.wikipedia.org/wiki/SAML_2.0.
|
147
|
+
When you understand what it says, read these parts of the specification:
|
148
|
+
http://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf
|
149
|
+
http://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf
|
150
|
+
|
151
|
+
Below is an example of a very primitive IDP Saml Controller
|
152
|
+
|
153
|
+
```ruby
|
154
|
+
class SamlController < ActionController::Base
|
155
|
+
extend Saml::Rails::ControllerHelper
|
156
|
+
current_provider "entity_id"
|
157
|
+
|
158
|
+
def receive_authn_request
|
159
|
+
authn_request = if request.get?
|
160
|
+
Saml::Bindings::HTTPRedirect.receive_message(request, type: :authn_request)
|
161
|
+
elsif request.post?
|
162
|
+
Saml::Bindings::HTTPPost.receive_message(request, type: :authn_request)
|
163
|
+
else
|
164
|
+
return head :not_allowed
|
165
|
+
end
|
166
|
+
request_id = authn_request._id
|
167
|
+
|
168
|
+
session[:saml_request] = {
|
169
|
+
request_id: request_id,
|
170
|
+
relay_state: params['RelayState'],
|
171
|
+
authn_request: authn_request.to_xml
|
172
|
+
}
|
173
|
+
|
174
|
+
if authn_request.invalid?
|
175
|
+
redirect_to send_response_path(request_id: request_id)
|
176
|
+
else
|
177
|
+
redirect_to sign_in_path(return_to: send_response_path(request_id: request_id))
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
def send_response
|
182
|
+
return head :not_found if session[:saml_request][:request_id] != params[:request_id]
|
183
|
+
|
184
|
+
authn_request = Saml::AuthnRequest.parse(session[:saml_request][:authn_request], single: true)
|
185
|
+
|
186
|
+
response = if authn_request.invalid?
|
187
|
+
build_failure(Saml::TopLevelCodes::REQUESTER, Saml::SubStatusCodes::REQUEST_DENIED)
|
188
|
+
elsif account_signed_in?
|
189
|
+
build_success_response
|
190
|
+
else
|
191
|
+
build_failure(Saml::TopLevelCodes::RESPONDER, Saml::SubStatusCodes::NO_AUTHN_CONTEXT)
|
192
|
+
end
|
193
|
+
|
194
|
+
if authn_request.protocol_binding == Saml::ProtocolBinding::HTTP_POST
|
195
|
+
# render an auto submit form with hidden fields set in the attributes hash
|
196
|
+
@attribute = Saml::Bindings::HTTPPost.create_form_attributes(response, relay_state: session[:saml_request][:relay_state])
|
197
|
+
else
|
198
|
+
# handle unsported binding
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
private
|
203
|
+
|
204
|
+
def build_failure(status_value, sub_status_value)
|
205
|
+
Saml::Response.new(in_response_to: session[:saml_request][:request_id], status_value: status_value, sub_status_value: sub_status_value)
|
206
|
+
end
|
207
|
+
|
208
|
+
def build_success_response(authn_request)
|
209
|
+
assertion = Saml::Assertion.new(
|
210
|
+
name_id: current_account.username, # Return anything that you can link to an account
|
211
|
+
name_id_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
|
212
|
+
authn_context_class_ref: Saml::ClassRefs::PASSWORD_PROTECTED,
|
213
|
+
in_response_to: authn_request._id,
|
214
|
+
recipient: authn_request.assertion_url,
|
215
|
+
audience: authn_request.issuer
|
216
|
+
}
|
217
|
+
|
218
|
+
# adding custom attributes
|
219
|
+
assertion.add_attribute('name', 'value')
|
220
|
+
|
221
|
+
Saml::Response.new(in_response_to: authn_request._id,
|
222
|
+
assertion: assertion,
|
223
|
+
status_value: Saml::TopLevelCodes::SUCCESS)
|
224
|
+
end
|
225
|
+
end
|
120
226
|
```
|
121
227
|
|
122
228
|
## Contributing
|
123
229
|
|
124
230
|
- Fork the project
|
125
231
|
- Contribute your changes. Please make sure your changes are properly documented and covered by tests.
|
126
|
-
- Send a pull request
|
232
|
+
- Send a pull request
|
@@ -19,10 +19,18 @@ module Saml
|
|
19
19
|
|
20
20
|
attribute :comparison, String, :tag => "Comparison"
|
21
21
|
|
22
|
-
|
22
|
+
has_many :authn_context_class_refs, String, :namespace => "saml", :tag => "AuthnContextClassRef"
|
23
23
|
|
24
24
|
validates :authn_context_class_ref, :presence => true, :inclusion => ALL_CLASS_REFS
|
25
25
|
validates :comparison, :inclusion => ComparisonTypes::ALL
|
26
|
+
|
27
|
+
def authn_context_class_ref
|
28
|
+
authn_context_class_refs.first if authn_context_class_refs
|
29
|
+
end
|
30
|
+
|
31
|
+
def authn_context_class_ref=(ref)
|
32
|
+
self.authn_context_class_refs = [ref]
|
33
|
+
end
|
26
34
|
end
|
27
35
|
end
|
28
36
|
end
|
data/lib/saml/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libsaml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Benoist Claassen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -222,7 +222,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
222
222
|
version: '0'
|
223
223
|
requirements: []
|
224
224
|
rubyforge_project:
|
225
|
-
rubygems_version: 2.
|
225
|
+
rubygems_version: 2.4.6
|
226
226
|
signing_key:
|
227
227
|
specification_version: 4
|
228
228
|
summary: A gem to easily create SAML 2.0 messages.
|