tl; dr:可以使用adfs中的angular获取持有者令牌,但无法在网络服务器上进行身份验证
对于一个新项目,我们使用asp.net web api 2(.net 4.5.2)实现一个api,它由一个javascript应用程序使用(以角度编写,但无关紧要)。我们的用户帐户存储在AD中,我们很乐意使用它。
在我们的旧应用程序中,使用mvc,很容易连接所有内容并访问您在ADFS中指定的声明,但使用js却证明是困难的。
使用adfs 3中的新端点,我们可以使用javascript(以及一些web api)获取beaerer令牌:
GET https://path.to.sts/adfs/oauth2/authorize?parameters
给我们一个令牌,我们将其传递给我们的网络API(否则STS会因CORS错误阻止您):
$scope.tokenRequest = {
grant_type: "authorization_code",
client_id: "client id thing",
redirect_uri: "http://path.to.api/api/token",
code: "Token from prev call"
}
$http({
method:'POST',
url: "https://kevin.local/app/test/token",
data: $scope.tokenRequest,
headers: {'Content-Type': 'text/json'}
})
.success(function(response){
$cookies['token'] = response['access_token'];
})
电话是:
public async Task<IHttpActionResult> Token(OAuthResquest request)
{
string accessToken = string.Empty;
HttpClient client = new HttpClient();
var postData = new List<KeyValuePair<string, string>>();
postData.Add(new KeyValuePair<string, string>("grant_type", request.grant_type));
postData.Add(new KeyValuePair<string, string>("code", request.code));
postData.Add(new KeyValuePair<string, string>("client_id", request.client_id));
postData.Add(new KeyValuePair<string, string>("redirect_uri", request.redirect_uri));
HttpContent content = new FormUrlEncodedContent(postData);
var response = (await client.PostAsync(new Uri
("https://path.to.sts/adfs/oauth2/token"), content));
response.EnsureSuccessStatusCode();
string result = null;
if (response.IsSuccessStatusCode)
{
if (response.Content != null)
result = (await response.Content.ReadAsStringAsync());
obj = JsonConvert.DeserializeObject(result);
}
else
{
return StatusCode(response.StatusCode);
}
HttpContext.Current.Response.Cookies.Add(new HttpCookie("accessToken", result["accessToken"]));
return Ok(obj);
}
这给了我们一个持有人令牌。在角度我有一个拦截器,它将此添加到每个http请求,这是有效的,因为我可以在检查器中看到它。
不幸的是,这是我被卡住的地方。在给定持票人令牌的情况下,我似乎无法使用adfs找到如何使身份验证工作:
$http.get("https://api.url/apo/call/to/auth/endpoint")
.success(function (res) {
console.log("mothafucking auth calls", res);
})
在startup.cs中我有:
public void Configuration(IAppBuilder appBuilder)
{
HttpConfiguration config = new HttpConfiguration();
ConfigureAuth(appBuilder);
WebApiConfig.Register(config);
appBuilder.UseWebApi(config);
}
在startup.auth.cs中,我们使用app.UseOAuthBearerToken
,app.UseActiveDirectoryFederationServicesBearerAuthentication
,app.UseOAuthBearerTokens(OAuthOptions)
和app.UseOAuthBearerAuthentication
进行了实验,但我仍然在使用[授权]修饰的api调用获得401,更不用说访问我们在adfs中指定的声明了。
public void ConfigureAuth(IAppBuilder app)
{
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
//What middleware do we need to activate with what options?
app.UseOAuthBearerTokens(options);
app.UseActiveDirectoryFederationServicesBearerAuthentication(new Microsoft.Owin.Security.ActiveDirectory.ActiveDirectoryFederationServicesBearerAuthenticationOptions()
{
//What goes here?
});
}
此用例的文档似乎严重缺乏。我们使用本地帐户(用户必须注册),使用facebook或google,..
找到了这方面的示例如果我们在所有这些之间放置一个MVC层,我们可以修复它,但那是我们最糟糕的情况,我们真的希望能够从javascript(或移动设备)消耗我们的api。
谢谢!