我按照电源BI网络应用验证文档中提供的说明操作,并且能够获取身份验证令牌。但该过程要求用户在GUI中输入凭证以获取身份验证代码。
相反,我想做静默认证,即没有GUI认证。我尝试了几种方法,比如在下面的链接中使用HHTPClient和参考代码
https://gist.github.com/dquig/a4f2f02fe3e306cebe2e
但它要求client_secret,遗憾的是没有方法接受cleint_secret以及resourceuri,clientId,用户名,密码,回调。 am使用1.0.0版本的azure adal4j。这是版本问题吗?任何帮助都将大大贬值
答案 0 :(得分:0)
我想你想看一下这篇博文:http://www.cloudidentity.com/blog/2014/07/08/using-adal-net-to-authenticate-users-via-usernamepassword/
ADAL .NET客户端库API现在具有接受用户名和密码的方法。该文章包括所有约束和限制的列表。如果您的使用不在快乐的道路上,我认为您需要提示用户。
我应该提一下,如果你为用户存储刷新令牌,你应该每90天(或刷新令牌到期时)提示一次。
答案 1 :(得分:0)
由于使用客户端应用程序获取Azure AD访问令牌,因此必须在GUI身份验证上输入用户名和密码。如果按照Web应用程序身份验证(https://msdn.microsoft.com/en-us/library/mt143610.aspx)进行身份验证,则符合client_secret
要求。
所以我使用端点https://login.microsoftonline.com/<tenantId>/oauth2/token
从Power BI获取访问令牌,并用Java创建了一个控制台应用程序示例。
以下是pom.xml
文件中的maven依赖项配置。
使用1.0.0版本的Azure adal4j很好,但建议更新最新版本。
<dependencies>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>adal4j</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.1</version>
</dependency>
</dependencies>
示例代码如下。
String clientId = "<clientId>";
String clientSecret = "<key>";
String tenantId = "<tenantId>";
String authority =String.format("https://login.microsoftonline.com/%s/oauth2/token", tenantId);
String resource = "https://analysis.windows.net/powerbi/api";
AuthenticationContext context = null;
AuthenticationResult result = null;
ExecutorService service = null;
try {
service = Executors.newFixedThreadPool(1);
context = new AuthenticationContext(authority, false, service);
ClientCredential credential = new ClientCredential(clientId, clientSecret);
Future<AuthenticationResult> future = context.acquireToken(resource, credential, null);
result = future.get();
} finally {
service.shutdown();
}
String accessToken = null;
if (result == null) {
throw new ServiceUnavailableException("authentication result was null");
} else {
accessToken = result.getAccessToken();
System.out.println("Access Token: " + accessToken);
}
如有任何疑虑,请随时告诉我。
C#的更新:
public static string GetAccessToken()
{
var authenticationContext = new AuthenticationContext("{authorityURL}");
var credential = new ClientCredential(clientId: "{application id}", clientSecret: "{application password}");
var result = authenticationContext.AcquireToken(resource: "{resourceURL}", clientCredential:credential);
if (result == null) {
throw new InvalidOperationException("Failed to obtain the JWT token");
}
string token = result.AccessToken;
return token;
}
请参阅AuthenticationContext.AcquireToken
https://msdn.microsoft.com/en-us/library/dn479466.aspx的参考资料。
答案 2 :(得分:0)
如果您将应用注册为本机客户端应用,则需要提供客户端密钥。然后,您就可以使用用户名和密码流而无需通过交互式登录。