.NET Web API 2 OWIN 持有者令牌身份验证
Posted
技术标签:
【中文标题】.NET Web API 2 OWIN 持有者令牌身份验证【英文标题】:.NET Web API 2 OWIN Bearer Token Authentication 【发布时间】:2013-11-15 04:07:40 【问题描述】:我正在我的 .NET Web 应用程序中实现 Web API 2 服务架构。使用请求的客户端是纯 javascript,没有 mvc/asp.net。我正在使用 OWIN 尝试按照本文OWIN Bearer Token Authentication with Web API Sample 启用令牌身份验证。我似乎在授权后的身份验证步骤中遗漏了一些东西。
我的登录信息如下:
[HttpPost]
[AllowAnonymous]
[Route("api/account/login")]
public HttpResponseMessage Login(LoginBindingModel login)
// todo: add auth
if (login.UserName == "a@a.com" && login.Password == "a")
var identity = new ClaimsIdentity(Startup.OAuthBearerOptions.AuthenticationType);
identity.AddClaim(new Claim(ClaimTypes.Name, login.UserName));
AuthenticationTicket ticket = new AuthenticationTicket(identity, new AuthenticationProperties());
var currentUtc = new SystemClock().UtcNow;
ticket.Properties.IssuedUtc = currentUtc;
ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(30));
DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
return new HttpResponseMessage(HttpStatusCode.OK)
Content = new ObjectContent<object>(new
UserName = login.UserName,
AccessToken = Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket)
, Configuration.Formatters.JsonFormatter)
;
return new HttpResponseMessage(HttpStatusCode.BadRequest);
返回
accessToken: "TsJW9rh1ZgU9CjVWZd_3a855Gmjy6vbkit4yQ8EcBNU1-pSzNA_-_iLuKP3Uw88rSUmjQ7HotkLc78ADh3UHA3o7zd2Ne2PZilG4t3KdldjjO41GEQubG2NsM3ZBHW7uZI8VMDSGEce8rYuqj1XQbZzVv90zjOs4nFngCHHeN3PowR6cDUd8yr3VBLdZnXOYjiiuCF3_XlHGgrxUogkBSQ",
userName: "a@a.com"
然后我尝试在 AngularJS 中的进一步请求上设置 HTTP 标头 Bearer
,例如:
$http.defaults.headers.common.Bearer = response.accessToken;
到这样的 API:
[HttpGet]
[Route("api/account/profile")]
[Authorize]
public HttpResponseMessage Profile()
return new HttpResponseMessage(HttpStatusCode.OK)
Content = new ObjectContent<object>(new
UserName = User.Identity.Name
, Configuration.Formatters.JsonFormatter)
;
但无论我做什么,这项服务都是“未经授权的”。我在这里遗漏了什么吗?
【问题讨论】:
您提供的文章链接显示的页面显示“此项目尚未发布。”。我对使用不记名令牌启用 Web api 授权非常感兴趣。您能否提供任何资源或您使用的文章的更新链接?谢谢。 嗨,在您的代码中,我看不到您是如何生成访问令牌的!你能澄清一下吗? @s0nica .net 使用 owin 自动执行此操作 好的,但我看不到您在何处以及如何定义变量accessToken
并为其赋值。
@PeterStulinski - 我写了一个要点,其中包含我用于实现的所有代码:gist.github.com/amcdnl/8239023
【参考方案1】:
通过使用 Bearer + 令牌设置标头“授权”来解决,例如:
$http.defaults.headers.common["Authorization"] = 'Bearer ' + token.accessToken;
【讨论】:
一个问题:如何存储访问令牌以避免重新认证?你把它存储在 cookie 中还是什么的? @Blaise - 是的 ASP.NET 在返回时自动设置它。 @Blaise 如果您使用的是 VS2013 中提供的 SPA 模板,则令牌存储在 sessionStorage 或 localStorage 中。 “.AspNet.Cookies” cookie 用于 cookie 身份验证(如果您同时启用)。如果您没有明确告诉 Web API 忽略 cookie 身份验证(在 SPA 模板中为您完成),那么无论您是否传递不记名令牌,它仍将使用所述 cookie 进行身份验证。 感谢您提供此信息。【参考方案2】:您可以使用 Angular 应用程序模块对其进行配置。因此,授权令牌将被设置为每个 http 请求的标头。
var app = angular.module("app", ["ngRoute"]);
app.run(function ($http)
$http.defaults.headers.common.Authorization = 'Bearer ' + token.accessToken;
);
【讨论】:
以上是关于.NET Web API 2 OWIN 持有者令牌身份验证的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Asp.Net Web API 2 中使用 Owin OAuth2 修改令牌端点响应正文
没有 OWIN 和 AspNet.Identity 的基于 Asp.Net Web Api 令牌的授权
具有混合身份验证 JWT 和 SAML 的 ASP.NET Web API 2.2 OWIN