小编Sta*_*ros的帖子

如何成为SAML服务提供商

大家早上好,

我公司目前正在开发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该用户已离开?

最后,在我的阅读中有几个主题被抛出,我不确定它们如何适应这个工作流程.它们是 …

security authentication saml

79
推荐指数
1
解决办法
4万
查看次数

LDAP与SAML授权

我目前正在研究将资产跟踪系统从LDAP迁移到SAML.我们的软件目前使用LDAP有两个主要方面.第一个是身份验证.要立即访问系统,您需要使用LDAP成功进行身份验证并成为指定LDAP组的成员.转移到SAML非常简单.我们利用一个库来处理大部分肮脏的工作.在IDP上,我们可以添加声明来授权用户.但我们第二次使用LDAP会让我陷入困境.

今天,我们维护的每个资产都可以链接到用户名.例如,特定的打印机可能属于"某个用户".我们的软件为管理员提供的选项之一是基于LDAP用户组查看资产/与资产交互.因此,作为管理员,我可能希望更新特定部门中人员拥有的所有打印机.为此,管理员将创建一个作用于LDAP组"departmentInQuestion"的规则.然后,我们的软件将使用服务帐户连接到LDAP,创建查询以查看我们系统中的哪些用户位于"departmentInQuestion"中,执行该操作并使用结果确定哪些资产应获得更新.

从我的搜索到目前为止,我还没有找到类似于此的SAML工作流程.看来我们唯一有机会评估'someuser'是在他们进行身份验证时,我们可以访问他们的声明.但在我们的工作流程中,"someuser"可能永远不会与我们进行身份验证 这几乎就像我们使用代表服务帐户授权用户一样.在我的探索过程中是否存在我忽略的现有工作流程?是否有其他技术以这种方式支持授权?

感谢您的任何意见!

authentication authorization ldap saml

16
推荐指数
2
解决办法
5万
查看次数

使用NSURLConnection和NSURLProtectionSpace确定信任

我想问一个先前提出的问题的后续问题.我已经有了创建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)

iphone cocoa-touch certificate nsurlconnection ios

14
推荐指数
1
解决办法
1万
查看次数

来自CA的PKCS12 Java密钥库和java中的用户证书

我最近负责用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密钥库?我是否走在正确的轨道上?

提前致谢!

java encryption pki pkcs#12 x509certificate

13
推荐指数
1
解决办法
3万
查看次数

对LDAP服务器的代理HTTP摘要认证请求

最近,我们一直致力于一个项目,该项目将我们的Tomcat Web服务器与移动设备上的一些特定服务集成在一起.在我们与设备交互(通过HTTP)期间我们可以做的事情之一是让设备提示用户提供凭据.用户输入凭据后,我们的服务器会收到一个HTTP帖子,其中包含标准HTTP摘要认证标头(带有nonce,realm,response等的授权标头).没有什么大惊喜.

我们的服务器(按设计)实际上并不包含任何用户的密码.我们保留了密码的SHA512哈希值.对于本地用户,我们可以在登录到应用程序时开始存储"用户名:realm:password"的MD5.当您不存储密码时,这是处理摘要身份验证的常用方法吗?

更重要的是,我们通过我们为验证编写的一些JNDI代码与LDAP服务器进行交互.由于设备被强制通过http与我们的服务器进行身份验证,而digest是唯一支持的授权方法,我们似乎无法找到使用摘要响应通过LDAP对用户进行身份验证的方法.从概念上讲,你能够"代理"摘要请求似乎并不正确.是否有工作流程允许这种类型的"通过"身份验证,如果是这样,它甚至是一个好主意?

谢谢!

java authentication ldap http digest-authentication

9
推荐指数
1
解决办法
1396
查看次数

NSURLConnection,NSURLRequest,不受信任的证书和用户身份验证

大家早上好,

我一直在尝试编写一个从需要身份验证的远程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 cocoa nsurlconnection nsurlrequest nsurlcredential

8
推荐指数
1
解决办法
3821
查看次数

适用于iPhone的NSXMLParser内存分配效率

我最近一直在玩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)

iphone cocoa memory-management nsxmlparser

6
推荐指数
2
解决办法
2377
查看次数

使用带有签名,加密和编码的JAXB

最近我们的任务是为我们的产品提出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中缺少一些基本的东西,在我得到它之后会变得轻而易举.

谢谢!

java xml jaxb pki

6
推荐指数
1
解决办法
1307
查看次数

打破RSA加密的大数据

最近我们一直在使用OpenSSL帮助加密/解密我们拥有的一些数据.每个"客户端"将具有本地证书颁发机构为其提供的公钥/私钥对和X509证书.我现在正在考虑使用该密钥对加密/解密数据.

我所研究的所有内容都使用这些方法RSA_public_encryptRSA_private_decryptRSA加密来展示.但是我可以一次加密的数据量受限RSA_size(rsa) - 41于填充类型RSA_PKCS1_OAEP_PADDING.所以我的问题是如何在坚持我们的RSA方案(没有静态关键短语等)的同时加密大量数据.我正在考虑将数据分解成块然后加密它,但这似乎正在打败填充点.

任何帮助,将不胜感激.

c security encryption openssl

5
推荐指数
1
解决办法
810
查看次数

Tomcat 8.0-MIME映射和内容类型

最近,我一直在研究导致我在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)

tomcat servlets content-type mime-types tomcat8

5
推荐指数
1
解决办法
6257
查看次数

Java,Apache HttpClient,TLSv1.2和OpenJDK 7

我们有一小组运行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)

java ssl openjdk apache-httpclient-4.x

3
推荐指数
1
解决办法
4982
查看次数

iPhone - 用户默认值和UIImages

我过去几个月一直在开发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不允许我做的事情.思考?我觉得我可能走错了路......

iphone cocoa-touch nsuserdefaults uiimage

2
推荐指数
1
解决办法
2401
查看次数

导航到SplitViewController

我一直在玩iPad SDK寻找改进我当前iPhone应用程序的方法.我有几个地方,我认为新的"SplitView"看起来会很不错.我的问题是,是否可以使用我当前基于导航的应用程序导航到"SplitView"?主要是我不知道如何将SplitViewController推送到我当前的视图堆栈.有什么想法吗?

iphone cocoa-touch uinavigationcontroller ipad iphone-sdk-3.2

2
推荐指数
1
解决办法
3069
查看次数