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
我目前正在学习 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