Android Windows 认证
Android Windows authentication
DefaultHttpHandler 已弃用,HttpURLConnection 不支持 NTLM,NTLM 似乎是 ASP.NET MCV 网站唯一支持良好的协议。那么,还有什么事要做?
在我们的业务中,我们使用 Microsoft。我们用微软登录,我们的webmail是微软做的,我们的平板应用是Android...
目前我正在做一个需要连接到 ASP.NET entity framework 网络界面的项目。此 Web 界面托管在 IIS 上,配置了 Windows 身份验证,使用 NTLM 作为提供程序。
我正在制作的应用程序必须访问此网络界面。所以,我向用户询问他们的用户名和密码,并希望在网络界面上登录。但是,Android 根本不支持 NTLM。我一直在四处寻找,但这种组合似乎很少见。我想知道,我有什么选择?
我可以随意处理任何事情。唯一的要求是用户使用他们的 Microsoft 帐户登录,我们不希望使用价格过高的 Xamarin。你会推荐什么?
好的,我做的第一件事就是导入 JCIFS 库。它是您从 link.
下载的 jar
接下来我需要做的是将 JCIFSEngine class 和 NTLMSchemeFactory class 导入到您的项目中。
最后这个方法构建了你的 HTTPClient:
//I know it is deprecated but there is no other way to implement NTLM thus far.
private static DefaultHttpClient setupHttpClient (String username, String password) {
DefaultHttpClient httpclient = new DefaultHttpClient();
// register ntlm auth scheme
httpclient.getAuthSchemes().register("ntlm", new NTLMSchemeFactory());
httpclient.getCredentialsProvider().setCredentials(
// Limit the credentials only to the specified domain and port
new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
// Specify credentials, most of the time only user/pass is needed
new NTCredentials(username, password, "", "")
);
return httpclient;
}
我的连接是通过 Retrofit 完成的,所以我只使用以下行将此 HTTPClient 附加到 retrofit:
retrofitAdapterBuilder.setClient(new ApacheClient(setupHttpClient(username, password)));
到目前为止,这对我有用,尽管 Android 没有对此的本地支持真的很糟糕。
编辑:添加 Okhttp 实现。这是一个旧的 class,我们不再使用它,因为我们决定放弃 NTLM 支持,但它曾经可以工作。请记住,我们连接到可以进行 basic/windows/azure 身份验证的服务器,因此我们需要进行多项检查,而您可能不需要这样做。
首先创建一个class实现okhttp的Authenticator接口。然后在 authenticate() 方法中执行以下操作:
@Override
public Request authenticate(Route route, okhttp3.Response response) throws IOException {
if (response == null || response.headers() == null || response.headers().toString().isEmpty()) {
return null;
}
final List<String> authHeaders = response.headers().values("WWW-Authenticate");
if (authHeaders.contains("NTLM")) {
return response.request().newBuilder().header("Authorization", "NTLM " + mNtlmInitialChallenge).build();
} else if (checkIsBasicAuth(authHeaders)) {
String credentials = mUsername + ":" + mPassword;
final String basic = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
return response.request().newBuilder().header("Authorization", basic).build();
}
if (mChallengeSent) {
return null;
} else {
mChallengeSent = true;
String ntlmFinalChallenge = null;
try {
ntlmFinalChallenge = mNtlmEngine.generateType3Msg(mUsername, mPassword, mDomain, "android-device", authHeaders.get(0).substring(5));
} catch (Exception e) {
e.printStackTrace();
}
return response.request().newBuilder().header("Authorization", "NTLM " + ntlmFinalChallenge).build();
}
}
要生成 mNtlmInitialChallenge,请创建以下方法:
private String getInitialNtlmChallenge() {
String initialChallenge = null;
try {
initialChallenge = mNtlmEngine.generateType1Msg(null, null);
} catch (Exception e) {
e.printStackTrace();
}
return initialChallenge;
}
mNtlmEngine class 我手动从 JCIFS 库复制过来,这样我就可以删除依赖项。
一些注意事项:
代码不是最干净的,因为这是 POC。
是的,我们使用了可怕的 mVariable 符号,我们不再使用它了。
您将不得不试用此实现,直到它适合您。
要将验证器附加到 okhttp 只需执行 client.authenticator(new NtlmAuthenticator(username, password, ""));
您可能需要实施一些故障机制。
在 MCV 中做 FBA https://msdn.microsoft.com/en-us/library/ff398049(v=vs.100).aspx
很好的支持。
DefaultHttpHandler 已弃用,HttpURLConnection 不支持 NTLM,NTLM 似乎是 ASP.NET MCV 网站唯一支持良好的协议。那么,还有什么事要做?
在我们的业务中,我们使用 Microsoft。我们用微软登录,我们的webmail是微软做的,我们的平板应用是Android...
目前我正在做一个需要连接到 ASP.NET entity framework 网络界面的项目。此 Web 界面托管在 IIS 上,配置了 Windows 身份验证,使用 NTLM 作为提供程序。
我正在制作的应用程序必须访问此网络界面。所以,我向用户询问他们的用户名和密码,并希望在网络界面上登录。但是,Android 根本不支持 NTLM。我一直在四处寻找,但这种组合似乎很少见。我想知道,我有什么选择?
我可以随意处理任何事情。唯一的要求是用户使用他们的 Microsoft 帐户登录,我们不希望使用价格过高的 Xamarin。你会推荐什么?
好的,我做的第一件事就是导入 JCIFS 库。它是您从 link.
下载的 jar接下来我需要做的是将 JCIFSEngine class 和 NTLMSchemeFactory class 导入到您的项目中。
最后这个方法构建了你的 HTTPClient:
//I know it is deprecated but there is no other way to implement NTLM thus far.
private static DefaultHttpClient setupHttpClient (String username, String password) {
DefaultHttpClient httpclient = new DefaultHttpClient();
// register ntlm auth scheme
httpclient.getAuthSchemes().register("ntlm", new NTLMSchemeFactory());
httpclient.getCredentialsProvider().setCredentials(
// Limit the credentials only to the specified domain and port
new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
// Specify credentials, most of the time only user/pass is needed
new NTCredentials(username, password, "", "")
);
return httpclient;
}
我的连接是通过 Retrofit 完成的,所以我只使用以下行将此 HTTPClient 附加到 retrofit:
retrofitAdapterBuilder.setClient(new ApacheClient(setupHttpClient(username, password)));
到目前为止,这对我有用,尽管 Android 没有对此的本地支持真的很糟糕。
编辑:添加 Okhttp 实现。这是一个旧的 class,我们不再使用它,因为我们决定放弃 NTLM 支持,但它曾经可以工作。请记住,我们连接到可以进行 basic/windows/azure 身份验证的服务器,因此我们需要进行多项检查,而您可能不需要这样做。
首先创建一个class实现okhttp的Authenticator接口。然后在 authenticate() 方法中执行以下操作:
@Override
public Request authenticate(Route route, okhttp3.Response response) throws IOException {
if (response == null || response.headers() == null || response.headers().toString().isEmpty()) {
return null;
}
final List<String> authHeaders = response.headers().values("WWW-Authenticate");
if (authHeaders.contains("NTLM")) {
return response.request().newBuilder().header("Authorization", "NTLM " + mNtlmInitialChallenge).build();
} else if (checkIsBasicAuth(authHeaders)) {
String credentials = mUsername + ":" + mPassword;
final String basic = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
return response.request().newBuilder().header("Authorization", basic).build();
}
if (mChallengeSent) {
return null;
} else {
mChallengeSent = true;
String ntlmFinalChallenge = null;
try {
ntlmFinalChallenge = mNtlmEngine.generateType3Msg(mUsername, mPassword, mDomain, "android-device", authHeaders.get(0).substring(5));
} catch (Exception e) {
e.printStackTrace();
}
return response.request().newBuilder().header("Authorization", "NTLM " + ntlmFinalChallenge).build();
}
}
要生成 mNtlmInitialChallenge,请创建以下方法:
private String getInitialNtlmChallenge() {
String initialChallenge = null;
try {
initialChallenge = mNtlmEngine.generateType1Msg(null, null);
} catch (Exception e) {
e.printStackTrace();
}
return initialChallenge;
}
mNtlmEngine class 我手动从 JCIFS 库复制过来,这样我就可以删除依赖项。
一些注意事项:
代码不是最干净的,因为这是 POC。
是的,我们使用了可怕的 mVariable 符号,我们不再使用它了。
您将不得不试用此实现,直到它适合您。
要将验证器附加到 okhttp 只需执行
client.authenticator(new NtlmAuthenticator(username, password, ""));
您可能需要实施一些故障机制。
在 MCV 中做 FBA https://msdn.microsoft.com/en-us/library/ff398049(v=vs.100).aspx
很好的支持。