2015-09-28 30 views
0

我有一个MVC Web应用程序,它使用OWIN/openid connect通过https://login.windows.net/common/验证用户身份。它基于azure/office 365示例:https://github.com/OfficeDev/Research-Project-Code-Sample如何使用OWIN使用令牌直接进行OpenID Connect验证

如果我理解正确的认证流程是这样的:

  1. 应用程序检查(基于一个cookie),如果已经有一个身份验证的用户
  2. 如果没有,那么它重定向到供应商授权页面(login.microsoftonline.com)
  3. 页面重定向到我的应用程序的授权码
  4. 我的应用程序的访问令牌的授权码再次调用提供者(或者是它的一个id_token?)
  5. 我的应用程序(OWIN组件)提取各种openid属性,并将它们设置在线程当前主体

工作正常。

现在我想让我的MVC应用程序调用我的Web API应用程序。 Web API应用程序永远不会由浏览器直接调用,而总是由MVC客户端调用。 Web API应用程序不使用Cookie,如果使用错误或陈旧的身份验证信息发出请求,则不能重定向。 Web API应用程序应该能够使用MVC应用程序获得的身份验证令牌进行调用,并使用它在执行线程上设置ClaimsPrincipal。另一种方法可能是让我在MVC应用程序中使用一些自定义解决方案来加密用户信息并将其发送到Web API,但这是最后的手段。我更喜欢使用标准的owin。

回答

2

如果您深入了解Azure示例,您会发现需要的东西。这里的关键是你想使用持票人令牌。

在Azure中,您需要为WebApi端创建一个新应用程序,并与您的客户端应用程序建立关系。我为我的客户端身份验证和WebApi使用了相同的应用程序ID,但无法正常工作。

在Web Api方面,您需要使用Windows Azure Active Directory承载认证来配置认证。

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
    new WindowsAzureActiveDirectoryBearerAuthenticationOptions 
    { 
     TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters() 
     { 
      ValidAudience = ConfigurationManager.AppSettings["ida:AppApiResourceId"], 
      SaveSigninToken = true 
     }, 
     AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active, 
     Tenant = ConfigurationManager.AppSettings["ida:Tenant"] 
    }); 

您可以使用Identity的引导上下文来获取令牌。我正在尝试各种各样的方法来获得令牌,然后SO答案帮助我获得(Acquiring an Access token by using JWT used for AzureBearerAuthentication)。还请注意,resourceId是WebApi应用程序的appId。

if (identity == null || !identity.IsAuthenticated) return null; 

AuthenticationResult authResult = null; 

var context = identity.BootstrapContext as BootstrapContext; 
var credential = new ClientCredential(AuthConfig.ClientId, AuthConfig.AppKey); 
if (context != null && context.Token != null) 
{ 
    authResult = authInfo.AuthContext.AcquireToken(resourceId, authInfo.Credential, 
     new UserAssertion(context.Token)); 
} 

return authResult; 

当你创建你需要将承载令牌的Authorization头下的每个请求的Web API的请求。

headers["Authorization"] = "bearer " + token; 
相关问题