当前位置: 首页 > 知识库问答 >
问题:

. NET Web API 2 OWIN不记名令牌身份验证

堵存
2023-03-14

我正在我的。NET web应用程序。消费请求的客户端是纯javascript,而不是mvc/asp.net。我使用OWIN来尝试启用令牌认证,按照这篇文章,“使用Web API进行OWIN不记名令牌认证”示例。我似乎在授权后的认证步骤中遗漏了一些东西。

我的登录看起来像:

    [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 标头承载,例如:

$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)
        };
    }

但无论我做什么,这项服务都是“未经授权的”。我错过了什么吗?

共有2个答案

归明诚
2023-03-14

您可以使用角度应用程序模块对其进行配置。因此,授权令牌将被设置为每个http请求的头。

var app = angular.module("app", ["ngRoute"]);
app.run(function ($http) {

     $http.defaults.headers.common.Authorization = 'Bearer ' + token.accessToken;

});
吴子昂
2023-03-14

通过使用承载令牌设置标头“Authorization”来解决,如:

$http.defaults.headers.common["Authorization"] = 'Bearer ' + token.accessToken;
 类似资料:
  • 使用 的请求可用于身份验证吗? 或者 我们应该使用另一种方法来验证客户端并颁发令牌,然后像OAuth2一样将令牌用作不记名令牌吗?为什么流行的Web服务(例如Github、AWS、Google…)使用其他方法(如AWS所做的:)来验证客户端。问题的重点是:以下流程中是否存在任何可值或违反标准的行为。 我想使用以下流程: :类似于Twitter客户端。 :类似于Twitter API。 < li >

  • 我有一个LaravelAPI(实际上是LumenAPI)服务于VueJS前端。Vue应用程序允许用户登录到谷歌。然后将Google令牌发送回Lumen API,后者使用Google验证令牌,然后验证电子邮件地址是否为有效用户。然后它生成一个令牌,与用户一起存储在数据库中,并返回用户对象。 我没有使用Passport或jwt auth之类的东西。那么现在,我如何使用默认的Auth中间件来验证(现在已

  • 我刚刚开始在.NET中开发我的第一个REST API。由于它将是无状态的,我将使用令牌进行身份验证: 基本思想(System.Security.Cryptography): null 检查凭据是否有效(用户名,将哈希密码与db值进行比较) 如果为真,则加密数据对象 对生成的令牌使用HMAC,并将其存储到数据库 将令牌(不带HMAC)返回给用户(cookie/字符串) 对需要身份验证的方法的请求:

  • 我正在尝试在Dropwizard web应用程序中实现OAuth2身份验证。我已经创建了所需的<code>验证器 我所需的行为是,在我的客户端通过在我的登录页面上提供他/她的凭据登录后,我想将客户端重定向到我使用Dropwizard Views创建的问候语页面,并且路径为“/me”,如下所示: 我的问候资源如下所示: 目前,我得到一个“访问此资源需要凭据。”登录后的响应。在阅读了一些关于令牌认证的

  • 在传统的基于cookie/JSESSION的身份验证的同时,是否可以使用基于令牌的(无状态)身份验证? 应用程序已经有一个现有的Spring MVC+Thymeleaf实现,用作管理/超级用户门户。当你登录时,你会得到一个JessionID。我们需要使用Jersey(JAX-RS)创建一个RESTful API以供客户端使用。要求是无状态的。本质上,我们仍然需要Spring MVC+Thymele