首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们应该如何在ASP.NET 5 MVC6中实施接入网关身份验证?

我们应该如何在ASP.NET 5 MVC6中实施接入网关身份验证?
EN

Stack Overflow用户
提问于 2016-12-12 23:31:24
回答 1查看 36关注 0票数 0

我们正在努力使用一个现有的接入网关,它可以有效地进行用户身份验证。当用户通过身份验证时,访问网关设置两个请求头,并将请求传递给我们的底层ASPNET5 MVC6 web应用程序。使用这些不是加密值的值,我们可以推导出一些东西,包括登录人员的用户is……我们没有得到密码或一些花哨的令牌。

谁能告诉我们实现接入网关身份验证的干净/正确的MVC6方法是什么?我们已经看到了几种身份验证解决方案,但它要么需要单个令牌,要么需要用户名+密码。

EN

回答 1

Stack Overflow用户

发布于 2016-12-13 00:13:56

实际上,你很幸运--因为你不需要自己处理授权问题。您所需要做的就是通知.NET基础设施。最简单的方法是添加您自己的IAuthenticationFilter

此示例假设您必须在请求中同时使用"X-FIRST-NAME“和"X-LAST-NAME”作为http-headers,才能将其视为经过身份验证的用户。

代码语言:javascript
复制
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);
    }
}

并将过滤器添加到管道中。

代码语言:javascript
复制
services.ConfigureMvc(options =>
{
  options.Filters.Add(new CustomHostAuthenticationFilter());
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41104214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档