大家早上好,
我公司目前正在开发Java Web应用程序.我们的几个客户有内部SAML服务器(身份提供商?),并要求我们与他们集成.所以最近我一直在阅读它并与OpenAM一起玩.大约3天后,我对它有一个大致的了解,但我的知识仍然存在一些差距.我希望有人可以为我解决这个问题.
所以这就是我如何想象用户登录的工作流程.
让我们将客户SAML服务器定义为https://their.samlserver.com.因此,用户访问我们的Web应用程序以获取受保护的资源.假设网址是http://my.app.com/something.
所以,如果我是正确的,my.app.com就是SAML定义为服务提供商的东西.我们的应用程序意识到该用户需要登录.然后我们向用户呈现这样的页面......
<script>JQuery Script to auto submit this form on ready</script>
<form method="post" action="https://their.samlserver.com/Post/Servlet">
<input type="hidden" name="SAMLRequest" value="someBase64Data" />
<input type="submit" value="Submit" />
</form>
Run Code Online (Sandbox Code Playgroud)
这someBase64Data
应该是base64
这个编码版本...
<samlp:AuthnRequest
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
ID="identifier_1"
Version="2.0"
IssueInstant="2004-12-05T09:21:59Z"
AssertionConsumerServiceIndex="0">
<saml:Issuer>http://my.app.com</saml:Issuer>
<samlp:NameIDPolicy
AllowCreate="true"
Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
</samlp:AuthnRequest>
Run Code Online (Sandbox Code Playgroud)
所以我的第一对问题.
假设的ID值是多少?
为什么我可以宣布自己为发行人?
身份提供商是否了解我?也许这就是信任圈
我一直在看OpenAM.如果它确实了解我,它如何了解我以及它需要知道什么?
因此,在用户转发该页面后,他们将被带到IDP https://their.samlserver.com提供的页面.他们在该页面上进行身份验证,IDP可以验证身份验证并查找用户.身份验证成功后,IDP会在此处发送回<samlp:Response>
定义的内容.
还有一些问题.
首先,如何<samlp:Response>
返回我的Web应用程序以便检查它?
我应该在该回复中寻找什么来验证它是否成功?失败是什么样的?
我们目前使用电子邮件地址(LDAP)来识别用户,因此我们可能会从响应中获取并以与我们现在相同的方式使用它.还有什么我应该注意的回应?
所以现在我们已经检查了有效性的响应,我们可以向用户授予像我们当前那样的会话.但是当他们想要注销时,是否有工作流程?我是否必须通知IDP该用户已离开?
最后,在我的阅读中有几个主题被抛出,我不确定它们如何适应这个工作流程.它们是 …
我目前正在研究将资产跟踪系统从LDAP迁移到SAML.我们的软件目前使用LDAP有两个主要方面.第一个是身份验证.要立即访问系统,您需要使用LDAP成功进行身份验证并成为指定LDAP组的成员.转移到SAML非常简单.我们利用一个库来处理大部分肮脏的工作.在IDP上,我们可以添加声明来授权用户.但我们第二次使用LDAP会让我陷入困境.
今天,我们维护的每个资产都可以链接到用户名.例如,特定的打印机可能属于"某个用户".我们的软件为管理员提供的选项之一是基于LDAP用户组查看资产/与资产交互.因此,作为管理员,我可能希望更新特定部门中人员拥有的所有打印机.为此,管理员将创建一个作用于LDAP组"departmentInQuestion"的规则.然后,我们的软件将使用服务帐户连接到LDAP,创建查询以查看我们系统中的哪些用户位于"departmentInQuestion"中,执行该操作并使用结果确定哪些资产应获得更新.
从我的搜索到目前为止,我还没有找到类似于此的SAML工作流程.看来我们唯一有机会评估'someuser'是在他们进行身份验证时,我们可以访问他们的声明.但在我们的工作流程中,"someuser"可能永远不会与我们进行身份验证 这几乎就像我们使用代表服务帐户授权用户一样.在我的探索过程中是否存在我忽略的现有工作流程?是否有其他技术以这种方式支持授权?
感谢您的任何意见!
我想问一个先前提出的问题的后续问题.我已经有了创建NSURLRequest/Connection的代码,运行它并调用了用于身份验证的回调方法.这是具体的代码:
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust] || [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodDefault];
}
-(void)connection:(NSURLConnection *)connection
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if ([challenge previousFailureCount] > 0) {
[[challenge sender] cancelAuthenticationChallenge:challenge];
NSLog(@"Bad Username Or Password");
badUsernameAndPassword = YES;
finished = YES;
return;
}
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
{
if (appDelegate._allowInvalidCert)
{
// Go ahead...trust me!
[challenge.sender useCredential:
[NSURLCredential credentialForTrust: challenge.protectionSpace.serverTrust]
forAuthenticationChallenge: challenge];
}
else
{
TrustGenerator *tg = [[TrustGenerator alloc] init];
if ([tg getTrust:challenge.protectionSpace])
{
// Go ahead...trust me!
[challenge.sender …
Run Code Online (Sandbox Code Playgroud) 我最近负责用Java模拟Apple产品(iPhone配置实用程序).我有点坚持的其中一个部分是关于Exchange ActiveSync的一部分.在那里,它允许您从钥匙串中选择一个证书作为您的EAS帐户的凭据.经过一些研究,我发现它实际上创建了一个PKCS12密钥库,插入了我选择的证书的私钥,并将其编码为XML.到目前为止还没什么大不了的.如果我使用Keychain Access创建一个.p12文件,它上传没有问题.但是当我尝试将其转移到Java时,我遇到了一个问题.
假设我将之前用过的.s12文件中的一个证书导出为.cer文件(这是我们期望在环境中获得的).现在当我将它上传到Java时,我得到一个Certificate对象,如下所示......
KeyStore ks = java.security.KeyStore.getInstance("PKCS12");
ks.load(null, "somePassword".toCharArray());
CertificateFactory cf = CertificateFactory.getInstance("X.509", new BouncyCastleProvider());
java.security.cert.Certificate userCert = cf.generateCertificate(new FileInputStream("/Users/me/Desktop/RecentlyExportedCert.cer"));
Run Code Online (Sandbox Code Playgroud)
但是当我尝试......
ks.setCertificateEntry("SomeAlias", userCert);
Run Code Online (Sandbox Code Playgroud)
我得到例外......
java.security.KeyStoreException: TrustedCertEntry not supported
Run Code Online (Sandbox Code Playgroud)
因此,从证书中我转移到密钥上.但是使用这些证书(我也获得了CA证书),我只能访问公钥,而不是私钥.如果我试图像这样添加公钥...
java.security.cert.Certificate[] chain = {CACert};
ks.setKeyEntry("SomeAlias", userCert.getPublicKey().getEncoded(), chain);
Run Code Online (Sandbox Code Playgroud)
我明白了......
java.security.KeyStoreException: Private key is not stored as PKCS#8 EncryptedPrivateKeyInfo: java.io.IOException: DerValue.getOctetString, not an Octet String: 3
Run Code Online (Sandbox Code Playgroud)
所以现在我在这里.有没有人知道如何从.cer文件中获取私钥到Java中的PKCS12密钥库?我是否走在正确的轨道上?
提前致谢!
最近,我们一直致力于一个项目,该项目将我们的Tomcat Web服务器与移动设备上的一些特定服务集成在一起.在我们与设备交互(通过HTTP)期间我们可以做的事情之一是让设备提示用户提供凭据.用户输入凭据后,我们的服务器会收到一个HTTP帖子,其中包含标准HTTP摘要认证标头(带有nonce,realm,response等的授权标头).没有什么大惊喜.
我们的服务器(按设计)实际上并不包含任何用户的密码.我们保留了密码的SHA512哈希值.对于本地用户,我们可以在登录到应用程序时开始存储"用户名:realm:password"的MD5.当您不存储密码时,这是处理摘要身份验证的常用方法吗?
更重要的是,我们通过我们为验证编写的一些JNDI代码与LDAP服务器进行交互.由于设备被强制通过http与我们的服务器进行身份验证,而digest是唯一支持的授权方法,我们似乎无法找到使用摘要响应通过LDAP对用户进行身份验证的方法.从概念上讲,你能够"代理"摘要请求似乎并不正确.是否有工作流程允许这种类型的"通过"身份验证,如果是这样,它甚至是一个好主意?
谢谢!
大家早上好,
我一直在尝试编写一个从需要身份验证的远程Web服务执行某些GET的应用程序.我的主要问题是这些远程服务器中的大多数(并且有很多远程服务器)没有有效的证书.我有代码接受无效的证书和代码,以正确的uname&pass(下面)来响应挑战.我遇到的问题是让两人一起玩.我似乎无法找到一种方法来发送挑战NSURLCredential
或正确链接回调的方法.当我试图将它们连接起来时,我无法NSURLRequest
接到didReceiveAuthenticationChallenge
两次电话.
任何想法将不胜感激!
认证代码......
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if(!hasCanceled){
if ([challenge previousFailureCount] == 0) {
NSURLCredential *newCredential;
newCredential=[NSURLCredential credentialWithUser:_username password:_password persistence:NSURLCredentialPersistenceNone];
[[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
}
else {
[[challenge sender] cancelAuthenticationChallenge:challenge];
NSLog(@"Bad Username Or Password");
badUsernameAndPassword = YES;
finished = YES;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我最近一直在玩iPhone应用程序的代码来解析XML.坚持Cocoa,我决定使用NSXMLParser类.该应用程序将负责解析10,000多个"计算机",所有这些计算机都包含6个其他信息串.对于我的测试,我已经验证了XML的大小约为900k-1MB.
我的数据模型是通过唯一标识符将每台计算机保存在NSDictionary中.每台计算机也由NSDictionary代表信息.因此,在一天结束时,我最终得到一个包含10k其他NSDictionaries的NSDictionary.
我遇到的问题不是泄漏内存或高效的数据结构存储.当我的解析器完成后,分配的对象总量只会增加大约1MB.问题是当NSXMLParser运行时,我的对象分配高达13MB.我能理解2(一个用于我正在创建的对象,一个用于原始NSData)加上一个小工作空间,但13似乎有点高.我无法想象NSXMLParser效率低下.思考?
码...
开始解析的代码......
NSXMLParser *parser = [[NSXMLParser alloc] initWithData: data];
[parser setDelegate:dictParser];
[parser parse];
output = [[dictParser returnDictionary] retain];
[parser release];
[dictParser release];
Run Code Online (Sandbox Code Playgroud)
而解析器的委托代码......
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
if(mutableString)
{
[mutableString release];
mutableString = nil;
}
mutableString = [[NSMutableString alloc] init];
}
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if(self.mutableString)
{
[self.mutableString appendString:string];
}
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if([elementName isEqualToString:@"size"]){
//The initial key, tells me how many …
Run Code Online (Sandbox Code Playgroud) 最近我们的任务是为我们的产品提出XML通信规范.我的一些同事对JAXB的编组和解组XML文档有很高的评价.我花了一些时间玩它,我明白它们来自哪里.它使简单的XML文档变得简单.
现在把它提升一个档次.我希望在我们的通信模型中看到的一件事是"内置"签名验证,以便在我之后使用它.我遇到的一个问题是验证签名我需要将相应的XML视为字节.让我们来看看这个例子......
<topLevel>
<sensitiveData encoding="UTF8">
<creditCard>
<number>1234-1234-1234-1234</number>
<expDate>Oct 2020</expDate>
</creditCard>
</sensitiveData>
<signatureOfSensitiveData algorithm="SHA1WithRSA">VGhpc0lzQVNpZ25hdHVyZQ==</signatureOfSensitiveData>
</topLevel>
Run Code Online (Sandbox Code Playgroud)
编辑:我实际上并没有传递信用卡数据.这里只是一个例子.
如果我可以获得byte[]
"sensitiveData"标记内的所有内容(由编码确定)表示,那将会是多么美妙.我甚至不介意再次打电话给"unmarshall" byte[]
.
这也为我们打开了另一扇门.我们实际上可以将"压缩"和"加密"属性引入元素中.如果我们可以将它们视为一个byte[]
我们可以膨胀并解密它们然后传递它们再次进行解组.
旁注:我认为如果您对XML进行base64编码然后将其包含在元素中,则此方法有效.但这会迫使我们基于64甚至简单的文档,并在我们的消息中引入一些不必要的膨胀.
有什么想法解决这个问题吗?我希望我在JAXB中缺少一些基本的东西,在我得到它之后会变得轻而易举.
谢谢!
最近我们一直在使用OpenSSL帮助加密/解密我们拥有的一些数据.每个"客户端"将具有本地证书颁发机构为其提供的公钥/私钥对和X509证书.我现在正在考虑使用该密钥对加密/解密数据.
我所研究的所有内容都使用这些方法RSA_public_encrypt
和RSA_private_decrypt
RSA加密来展示.但是我可以一次加密的数据量受限RSA_size(rsa) - 41
于填充类型RSA_PKCS1_OAEP_PADDING.所以我的问题是如何在坚持我们的RSA方案(没有静态关键短语等)的同时加密大量数据.我正在考虑将数据分解成块然后加密它,但这似乎正在打败填充点.
任何帮助,将不胜感激.
最近,我一直在研究导致我在web-common_X_X.xsd中定义并在Web应用程序web.xml文件中使用的“ mime-mapping”元素的问题。我的目标是将Tomcat配置为在返回对特定servlet的响应时包括特定的Content-Type标头。
我发现以前的堆栈溢出文章都提到了该功能,但是我无法获得一个与Tomcat 8.0.33一起使用的简单示例。
对于此测试,我创建了以下servlet:
public class SimpleServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
IOUtils.write("Hello There!", resp.getOutputStream());
resp.setStatus(202);
}
}
Run Code Online (Sandbox Code Playgroud)
并具有以下web.xml:
<web-app
version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>SimpleServlet</servlet-name>
<servlet-class>com.jamf.swa.SimpleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SimpleServlet</servlet-name>
<url-pattern>*.swa</url-pattern>
</servlet-mapping>
<mime-mapping>
<extension>swa</extension>
<mime-type>text/rtf;charset=UTF-8</mime-type>
</mime-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)
我尝试使用“ mime-type”元素中包含和不包含字符集的测试。“ text / rtf”类型也是任意的。我已经测试了其他人。
启动应用程序后,我向/testing.swa发出以下请求:
curl --trace-ascii - http://localhost:8080/testing.swa
== Info: Trying ::1...
== Info: TCP_NODELAY set
== Info: Connected to localhost (::1) port 8080 (#0)
=> Send header, 89 …
Run Code Online (Sandbox Code Playgroud) 我们有一小组运行OpenJDK v1.7.0_111的Tomcat服务器.我们计划在今年夏天升级它们并进行迁移,但我们发现我们与之交互的客户端API在短期内需要TLSv1.2.我的最终愿望是找到一个配置更改以实现此目的.
托管在那里的应用程序以非常直接的方式创建它的SSL上下文:
SSLContext sslContext = SSLContexts.createDefault()
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
Run Code Online (Sandbox Code Playgroud)
SSLContexts
来自Apache的httpclient库(版本4.4.1),并且它也非常直接地介绍了它如何创建SSL上下文:
public static SSLContext createDefault() throws SSLInitializationException {
try {
SSLContext ex = SSLContext.getInstance("TLS");
ex.init((KeyManager[])null, (TrustManager[])null, (SecureRandom)null);
return ex;
} catch (NoSuchAlgorithmException var1) {
throw new SSLInitializationException(var1.getMessage(), var1);
} catch (KeyManagementException var2) {
throw new SSLInitializationException(var2.getMessage(), var2);
}
}
Run Code Online (Sandbox Code Playgroud)
在整个SSLConnectionSocketFactory
课程中,似乎只是使用该SSLSocket.getEnabledProtocols()
方法来确定哪些协议可供使用.请注意,this.supportedProtocols
在我的情况下为null.
public Socket createLayeredSocket(Socket socket, String target, int port, HttpContext context) throws IOException {
SSLSocket sslsock = (SSLSocket)this.socketfactory.createSocket(socket, target, port, true);
if(this.supportedProtocols …
Run Code Online (Sandbox Code Playgroud) 我过去几个月一直在开发iPhone应用程序.最近我想提升性能并缓存UI中使用的一些图像.用户从网上随机下载图像,因此我无法将特定图像添加到项目中.我也已经在使用NSUserDefaults来保存应用程序中的其他信息.
所以现在我试图将UIImages的字典保存到我的NSUserDefaults对象中并得到...
- [UIImage encodeWithCoder:]:发送到实例的无法识别的选择器
然后我决定使用名为UISaveableImage的类继承UIImage并实现NSCoding.所以现在我......
@implementation UISaveableImage
-(void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:super forKey:@"image"];
}
-(id)initWithCoder:(NSCoder *)decoder
{
if (self=[super init]){
super = [decoder decodeObjectForKey:@"image"];
}
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)
这并不比我开始时更好.如果我能够将UIImage转换为NSData我会很好,但我能找到的功能就像UIImagePNGRepresentation,它要求我知道这是什么类型的图像.UIImage不允许我做的事情.思考?我觉得我可能走错了路......
我一直在玩iPad SDK寻找改进我当前iPhone应用程序的方法.我有几个地方,我认为新的"SplitView"看起来会很不错.我的问题是,是否可以使用我当前基于导航的应用程序导航到"SplitView"?主要是我不知道如何将SplitViewController推送到我当前的视图堆栈.有什么想法吗?
iphone cocoa-touch uinavigationcontroller ipad iphone-sdk-3.2
iphone ×5
java ×4
cocoa-touch ×3
cocoa ×2
encryption ×2
ldap ×2
pki ×2
saml ×2
security ×2
c ×1
certificate ×1
content-type ×1
http ×1
ios ×1
ipad ×1
jaxb ×1
mime-types ×1
nsurlrequest ×1
nsxmlparser ×1
openjdk ×1
openssl ×1
pkcs#12 ×1
servlets ×1
ssl ×1
tomcat ×1
tomcat8 ×1
uiimage ×1
xml ×1