我该如何配置Jwt Bearer身份验证?

时间:2017-08-14 11:43:12

标签: c# model-view-controller jwt

我正在尝试创建一个使用Jwt令牌身份验证的Web应用程序,登录ect工作正常。 现在我正在尝试为谁可以访问哪些页面添加授权等等。在我的控制器上,我添加了[Authorize]。但是当我登录并尝试进行其中一个操作时,我总是会得到一个空白页面,当我检查它时,操作总会返回401 Unauthorized,是否有任何建议?

我的头文件服务,用于将授权标头发送到Api:

using System.Collections.Generic;

namespace RelationizeWeb.Facade.Services
{
    public class HeaderService : IHeaderService
    {
        private const string AuthorizationHeaderKey = "Authorization";
        private const string BearerHeaderValue = "Bearer";

        public Dictionary<string, List<string>> CreateAuthorizationHeader(string token)
        {
            var dict = new Dictionary<string, List<string>>
            {
                { AuthorizationHeaderKey, new List<string>{ $"{BearerHeaderValue} {token}" } }
            };
            return dict;
        }

        public Dictionary<string, List<string>> CreateHeader(string key, string value)
        {
            var dict = new Dictionary<string, List<string>>
            {
                { key, new List<string> { value } }
            };
            return dict;
        }
    }
}

我们制作的Api请求示例,例如我们的OpinionMakerService:

public IEnumerable<OpinionMaker> GetOpinionMakers(JwtTokenResponse jwt)
    {
        try
        {
            return (List<OpinionMaker>)_relationizeApiAgent.GetOpinionMakersWithHttpMessages(_headerService.CreateAuthorizationHeader(jwt.AccessToken)).Body;
        }
        catch(Exception)
        {
            return null;
        }
    }

1 个答案:

答案 0 :(得分:0)

您可以使用azure为您的应用程序生成JWT。您需要在REST API的UseJwtBearerAuthentication文件中调用名为StartUp.cs的扩展方法,并将[Authorize]属性用于控制器。 UseJwtBearerAuthentication方法的工作方式如下

app.UseJwtBearerAuthentication(new JwtBearerOptions
            {
                AutomaticAuthenticate = true,
                AutomaticChallenge = true,
                Authority = <your auth name>,
                Audience = <target audience URL>
            });

请参阅以下链接以获取更多参考 1。https://blogs.msdn.microsoft.com/webdev/2017/04/06/jwt-validation-and-authorization-in-asp-net-core/

  1. https://pioneercode.com/post/authentication-in-an-asp-dot-net-core-api-part-3-json-web-token
  2. 您可以使用ADAL.JS等客户端库来调用azure服务以获取JWT承载令牌,然后将每个请求中的令牌发送到控制器。它将在每个请求中得到验证。我们在使用Azure JWT身份验证的Angular2应用程序中遵循此方法。

    adal.js的链接 https://github.com/AzureAD/azure-activedirectory-library-for-js

    资源: https://blogs.msdn.microsoft.com/premier_developer/2017/04/26/using-adal-with-angular2/

    编辑:您可以使用以下代码访问JWT令牌,并在从另一个控制器调用控制器之前将其添加到Authorization标头

     HttpClient client = new HttpClient();
        var token = <add your token here>; // call GetToken() method here and extract access_token from JwtTokenResponse class property.
        client.DefaultRequestHeaders.Authorization = new 
        AuthenticationHeaderValue("Bearer", token.Substring("Bearer ".Length).Trim());
    
        //call the api method using SendAsync() or PostAsyc() etc.