我们正在努力使用一个现有的接入网关,它可以有效地进行用户身份验证。当用户通过身份验证时,访问网关设置两个请求头,并将请求传递给我们的底层ASPNET5 MVC6 web应用程序。使用这些不是加密值的值,我们可以推导出一些东西,包括登录人员的用户is……我们没有得到密码或一些花哨的令牌。
谁能告诉我们实现接入网关身份验证的干净/正确的MVC6方法是什么?我们已经看到了几种身份验证解决方案,但它要么需要单个令牌,要么需要用户名+密码。
发布于 2016-12-13 00:13:56
实际上,你很幸运--因为你不需要自己处理授权问题。您所需要做的就是通知.NET基础设施。最简单的方法是添加您自己的IAuthenticationFilter
此示例假设您必须在请求中同时使用"X-FIRST-NAME“和"X-LAST-NAME”作为http-headers,才能将其视为经过身份验证的用户。
public class CustomHostAuthenticationFilter : IAuthenticationFilter
{
public bool AllowMultiple { get { return true; } }
public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
var request = context.Request;
if (request == null)
{
throw new ArgumentException("Request must not be null.", nameof(context));
}
if (request.Headers != null)
{
string firstName = null;
IEnumerable<string> values;
if (request.Headers.TryGetValues("X-FIRST-NAME", out values) && values.Any())
{
firstName = values.First();
}
string lastName = null;
if (request.Headers.TryGetValues("X-LAST-NAME", out values) && values.Any())
{
lastName = values.First();
}
if (!string.IsNullOrEmpty(firstName) && !string.IsNullOrEmpty(lastName))
{
var identity = new ClaimsIdentity("JWT");
identity.AddClaim(new Claim(ClaimTypes.Name, firstName + " " + lastName));
var principal = new ClaimsPrincipal(identity);
context.Principal = principal;
}
}
return Task.FromResult(0);
}
public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
{
return Task.FromResult(0);
}
}并将过滤器添加到管道中。
services.ConfigureMvc(options =>
{
options.Filters.Add(new CustomHostAuthenticationFilter());
}https://stackoverflow.com/questions/41104214
复制相似问题