ASP.NET 5 (vNext) Web API: 如何建立授权header?

ASP.NET 5 (vNext) Web API: How to build authorization header?

我目前正在学习 Web API ASP.NET 5,因此实现了一个非常简单的应用程序,包括使用身份框架的用户授权/身份验证。

我的 AccountController 处理注册和登录的登录方法如下所示:

[HttpPost("[action]/{username};{password}")]
    public async Task<IActionResult> Login(string username, string password)
    {
        var result = await _signInManager.PasswordSignInAsync(username, password, false, lockoutOnFailure: false);

        if (result.Succeeded)
        {
            Logger.LogInformation(1, "User logged in.");
            return new HttpOkResult();
        }

        return new BadRequestResult();
    }

当我执行登录时,我得到一个 HTTP 结果,其中包含如下所示的 cookie:

Set-Cookie: .AspNet.Microsoft.AspNet.Identity.Application=CfDJ8 [...] 2XQ; path=/; httponly

我假设,cookie 包含我必须添加到 HTTP 请求的令牌,每当我想访问用某种 [Authorize] 属性修饰的控制器或方法时。

但是,我不确定包含此令牌的有效 HTTP 请求应该是什么样子。我尝试了以下请求,但没有成功:

GET http://localhost:9466/api/videogames/GetAll HTTP/1.1
User-Agent: Fiddler
Host: localhost:9466
Authorization: bearer CfDJ8 [...] 2XQ

也许来自失败授权的以下日志片段可能会有所帮助:

[10.03.2016 12:44:30] Information: [Microsoft.AspNet.Hosting.Internal.HostingEngine] Request starting HTTP/1.1 GET http://localhost:9466/api/videogames/GetAll  
[10.03.2016 12:44:30] Warning: [Microsoft.AspNet.Mvc.Controllers.ControllerActionInvoker] Authorization failed for the request at filter 'Microsoft.AspNet.Mvc.Filters.AuthorizeFilter'.
[10.03.2016 12:44:30] Information: [Microsoft.AspNet.Authentication.Cookies.CookieAuthenticationMiddleware] AuthenticationScheme: Microsoft.AspNet.Identity.Application was challenged.
[10.03.2016 12:44:30] Information: [Microsoft.AspNet.Mvc.ChallengeResult] Executing ChallengeResult with authentication schemes ().
[10.03.2016 12:44:30] Information: [Microsoft.AspNet.Mvc.Infrastructure.MvcRouteHandler] Executed action VideoGameStoreWebApi.Controllers.VideoGamesController.GetAll in 0ms
[10.03.2016 12:44:30] Information: [Microsoft.AspNet.Hosting.Internal.HostingEngine] Request finished in 0ms 302 
[10.03.2016 12:44:30] Information: [Microsoft.AspNet.Hosting.Internal.HostingEngine] Request starting HTTP/1.1 GET http://localhost:9466/Account/Login?ReturnUrl=%2Fapi%2Fvideogames%2FGetAll  
[10.03.2016 12:44:30] Information: [Microsoft.AspNet.Hosting.Internal.HostingEngine] Request finished in 0ms 404 

我将令牌添加到 HTTP 请求的方式是否有错误,或者身份框架如何处理用户授权是否存在我不知道的更基本的问题?

提前感谢您的回答!

在 web-APIs 中使用安全性的推荐方法是将 OAuth2 与不记名令牌一起使用。

您的设置存在问题,您正在尝试将表单身份验证与基于令牌的身份验证相结合。

要在 web-API 中使用不记名令牌,您需要在 web-API 中设置令牌服务(也称为 STS 或授权服务器)或使用一些外部令牌服务(例如google 或脸书)。

在您的网络中设置令牌服务-API 使用 asp.net 身份按如下方式完成。

PublicClientId = "self";
OAuthOptions = new OAuthAuthorizationServerOptions
{
    TokenEndpointPath = new PathString("/Token"),
    Provider = new ApplicationOAuthProvider(PublicClientId),
    AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
    // Note: Remove the following line before you deploy to production:
    AllowInsecureHttp = true
};

// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(OAuthOptions);

现在您可以使用jquery到post用户名和密码来授权服务器并获取访问令牌。

    var loginData = {
        grant_type: 'password',
        username: self.loginEmail(),
        password: self.loginPassword()
    };

    $.ajax({
        type: 'POST',
        url: '/Token',
        data: loginData
    }).done(function (data) {
        self.user(data.userName);
        // Cache the access token in session storage.
        sessionStorage.setItem(tokenKey, data.access_token);
    }).fail(showError);

然后您可以在后续调用 web-API.

时使用存储在会话存储中的访问令牌
var token = sessionStorage.getItem(tokenKey);
    var headers = {};
    if (token) {
        headers.Authorization = 'Bearer ' + token;
    }

    $.ajax({
        type: 'GET',
        url: '/api/values',
        headers: headers
    }).done(function (data) {
        self.result(data);
    }).fail(showError);

您可以找到有关如何使用 web-API 设置身份验证和授权的完整示例 here