.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

Web API 2,OWIN 身份验证,SignOut 不注销

Web Api OWIN - 如何在每个请求上验证令牌

ASP.NET 5 OAuth 持有者令牌身份验证