【问题标题】:On Premise ADFS 3.0 OAuth2 WebApi + AngularJS本地 ADFS 3.0 OAuth2 WebApi + AngularJS
【发布时间】:2017-10-19 02:31:58
【问题描述】:

我完全迷失了,任何帮助将不胜感激。

当我从 angularJS 通过我的客户端应用程序单击 Login 时,我会重定向到:

https://adfs.dev5.local/adfs/oauth2/authorize?response_type=code&client_id=09c9a8a2-6bf1-427d-89ba-45c2c02bb9fc&resource=urn%3Awebapi%3Atest&redirect_uri=https%3A%2F%2Flocalhost%3A44326%2F&state=52e4aa10-f082-4ee6-8823-543ec6e4dce4&client-request-id=e2751f34-f7db-41f4-8c1d-4463e2dca48b&x-client-SKU=Js&x-client-Ver=1.0.15&nonce=93039780-99f6-4efc-8b1b-58aa92df9f82

这很好,我可以输入我的电子邮件+密码。登录后,我会重定向到:

https://localhost:44326/?code=OLCE2LJVeU2Zy2-7Q4oIMg.6Pr0vZgW1QhBAMQoUlgIKAdAsno.q4scWy_ZFQHQEz08M3gU3KJU4NhXdimZiMpgSGBQ8xKN8BLK0Qoe1m1cK5TA2WLLyA14SlnnfA4yHEp5_pTWrIOYNrvOVzNiGU0Zkie-7ae2D1_3U1E1rTmLUTprIadU4gLmo2CeMHkM8gumS285wKsRsMpXVLcavjgjyRM3XoWXSDSP96_eeMgq1osQ1M5170rrGOh_DVqKG-xYnKk5PEC7cWikaR_pxCvwvayLMV0VQIIyq1GJ3CvgK8sWFJGdY3jz247Bh8RPH9-t2_Jz3_7wyqvfvfquAY8tQxElEN1IEoPMOwVdjfBgNlZlw7vtAo79jdH1C_TRNUC5T3IrXw&state=52e4aa10-f082-4ee6-8823-543ec6e4dce4&client-request-id=e2751f34-f7db-41f4-8c1d-4463e2dca48b

这是我感到困惑的地方我不认为它应该将我重定向到那个......,我知道我需要发布一些如何获取令牌,但是如何?我使用 Postman 并且能够获取访问令牌,但我不明白我的 WebAPI 如何将其转换为访问令牌?

我在 Windows Server 2012 R2 上使用 ADFS 3.0。

设置 ADFS:

Add-ADFSRelyingPartyTrust -Name MyWebAPI -Identifier urn:webapi:test -IssuanceAuthorizationRules '=> issue(Type = "http://schemas.microsoft.com/authorization/claims/permit", Value = "true");' -IssuanceTransformRules 'c:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"] => issue(claim = c);'

添加客户端:

Add-ADFSClient -Name "client" -ClientId "09c9a8a2-6bf1-427d-89ba-45c2c02bb9fc" -RedirectUri "https://localhost:44326/"

Startup.Auth.cs:

app.UseActiveDirectoryFederationServicesBearerAuthentication(
    new ActiveDirectoryFederationServicesBearerAuthenticationOptions
    {
        MetadataEndpoint = "https://adfs.dev5.local/FederationMetadata/2007-06/federationmetadata.xml",
        TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
        {
            ValidAudience = ConfigurationManager.AppSettings["ida:Audience"],
        }
    });

观众的网络配置:

<appSettings>
   <add key="ida:Audience" value="https://localhost:44326/" />
</appSettings>

AngularJS adal 设置:

adalProvider.init(
    {
        instance: 'https://adfs.dev5.local/', 
        tenant: 'adfs',
        clientId: '09c9a8a2-6bf1-427d-89ba-45c2c02bb9fc',
        redirectUri: 'https://localhost:44326/'
        //cacheLocation: 'localStorage', // enable this for IE, as sessionStorage does not work for localhost.
    },
    $httpProvider
);

【问题讨论】:

    标签: c# asp.net-web-api oauth-2.0 adfs3.0


    【解决方案1】:

    看看这些邮递员samples

    您会看到我完成了每个流程,但 ADFS 4.0 具有完整的 OpenID Connect / OAuth 堆栈。

    ADFS 3.0 只有身份验证。机密客户的代码授权。

    获得授权端点的代码后,您需要将其发送到令牌端点以获取实际令牌。

    有一个很好的例子here

    还要注意 js 客户端通常使用隐式流。

    【讨论】:

    • 谢谢,您为我提供了一个解决方案,关于 ADFS 3.0 仅提供 code 授权。我花了几天的时间调试+反复试验,终于找到了一个适合我的解决方案。这个想法是使用 Identity Server,这样我就可以使用 ADFS 3 作为外部登录和用于 OAuth 的 Identity Server。
    • @12seconds 这篇文章对我有很大帮助,但你是什么意思使用“身份服务器”进行 OAuth?我正在尝试从 AWS Lambda 函数运行 Dynamics CRM(本地,ADFS 3.0)Web 服务,重定向 URI 是通过 AWS API 网关的另一个 Lambda,但 ADFS 似乎不喜欢我的重定向(本地主机有效美好的)。知道我做错了什么吗?
    • @Heckflosse_230,ADFS 3.0 不支持 OAuth 2.0 令牌。因此,为了解决这个问题,我围绕 ADFS 3.0 构建了自己的 Identity Server 4(如果您愿意,您也可以使用 Identity Server 3),充当“中间人”。所以它是这样的:身份服务器 > 重定向到 ADFS 3.0 登录 > 将 SAML 令牌返回给身份服务器,身份服务器被转换为 OAuth 令牌。
    • 谢谢12秒!我会调查身份服务器。
    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多