ASP Web API承载令牌使用angular和ADFS3进行身份验证

时间:2016-03-09 12:25:28

标签: asp.net angularjs oauth-2.0 asp.net-web-api2 adfs

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.UseOAuthBearerTokenapp.UseActiveDirectoryFederationServicesBearerAuthenticationapp.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。

谢谢!

0 个答案:

没有答案