我正在尝试创建一个使用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;
}
}
答案 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/
您可以使用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.