首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ADFS2.0Windows2008WindowsWebAPI

ADFS2.0Windows2008WindowsWebAPI
EN

Stack Overflow用户
提问于 2014-06-15 15:46:21
回答 1查看 1.7K关注 0票数 10

我想制作一个与Web应用程序对话并使用ADFS2.0(在Windows2008R2上)进行身份验证的MVC Web应用程序。

我设法使MVC Web应用程序使用ADFS进行身份验证。

问:但我不知道如何将我的ADFS2.0(在Windows2008API上)从MVC联合到Web (假设它们将部署在不同的服务器上)?

我发现了很多关于如何使用WCF或Windows 2012 R2,但在Windows 2008 R2中没有使用Web和ADFS2.0的文章。

编辑,最后我选择了穷人代表团(将接收到的相同令牌传递给后端(因为再次调用adfs是没有意义的)

FrontEnd ->调用GetToken并插入授权头(我将其编码为base64)

代码语言:javascript
复制
public string GetToken()
{
    BootstrapContext bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as BootstrapContext;
    string token = bootstrapContext.Token;

    if (string.IsNullOrEmpty(token))
        token = ToTokenXmlString(bootstrapContext.SecurityToken as SamlSecurityToken);

    return token;
}

string ToTokenXmlString(SecurityToken token)
{
    var genericToken = token as GenericXmlSecurityToken;

    if (genericToken != null)
        return genericToken.TokenXml.OuterXml;

    var handler = SecurityTokenHandlerCollection.CreateDefaultSecurityTokenHandlerCollection();
    return ToTokenXmlString(token, handler);
}

string ToTokenXmlString(SecurityToken token, SecurityTokenHandlerCollection handler)
{
    if (!handler.CanWriteToken(token))
        throw new InvalidOperationException("Token type not suppoted");

    var sb = new StringBuilder(128);
    using (StringWriter stringWriter = new StringWriter(sb))
    {
        using (var textWriter = new XmlTextWriter(stringWriter))
        {
            handler.WriteToken(textWriter, token);
            return sb.ToString();
        }
    }
}

后端->分析和验证令牌->

代码语言:javascript
复制
public ClaimsIdentity GetIdentityFromToken(string tokenBase64)
{
    if (string.IsNullOrEmpty(tokenBase64))
        return null;

    byte[] tokenByteArray = Convert.FromBase64String(tokenBase64);
    string decodedToken = Encoding.UTF8.GetString(tokenByteArray);

    if (string.IsNullOrWhiteSpace(decodedToken))
        return null;
    try
    {
        var handlers = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.SecurityTokenHandlers;
        SecurityToken token;
        using (StringReader stringReader = new StringReader(decodedToken))
        {
            using (XmlTextReader xmlReader = new XmlTextReader(stringReader))
            {
                token = handlers.ReadToken(xmlReader);
            }
        }

        if (token == null)
            return null;

        return handlers.ValidateToken(token).FirstOrDefault();
    }
    catch (Exception e)
    {
        logger.Error(new AuthenticationException("Error validating the token from ADFS", e));

        return null;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-31 17:45:17

我通过将从Adfs接收到的承载令牌传递到web调用的授权头,然后使用Microsoft.Owin.Security.Jwt nuget包在web项目的owin启动期间将令牌转换为httpcontext当前标识来实现这一点。

本例使用jwt令牌作为承载令牌。为要使用的令牌类型选择合适的NuGet包。

在mvc控制器中构造WebRequest

代码语言:javascript
复制
 BootstrapContext bc = ClaimsPrincipal.Current.Identities.First().BootstrapContext as BootstrapContext;
 HttpWebRequest request = WebRequest.Create(ConfigurationManager.AppSettings["ApiUrl"]) as HttpWebRequest;
 request.Method = "GET";
 request.Headers["Authorization"] = "Bearer " + bc.Token;

在Startup.cs (Config)行之前的web 中的Owin app.UseWebApi文件.

代码语言:javascript
复制
 app.UseJwtBearerAuthentication(
            new JwtBearerAuthenticationOptions
            {
                AuthenticationMode = AuthenticationMode.Active,
                AllowedAudiences = new[] { ConfigurationSettings.AppSettings["ida:Realm"] },
                IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[] 
                    { 
                        new SymmetricKeyIssuerSecurityTokenProvider(
                            ConfigurationSettings.AppSettings["ida:ValidIssuer"],
                            ConfigurationSettings.AppSettings["ida:SymmetricKey"])
                    },
                Provider = new OAuthBearerAuthenticationProvider
                {
                    OnValidateIdentity = context =>
                    {
                        return System.Threading.Tasks.Task.FromResult<object>(null);
                    }
                }
            });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24231347

复制
相关文章

相似问题

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