2013-11-21 24 views
1

有2個項目的VS解決方案:mvc 3 web應用程序和STS。 當用戶第一次導航到頁面時,他被重定向到STS登錄頁面,在那裏進行身份驗證並返回。 一切正常。 現在需要改變流程。如何將STS與第三方集成在mvc web應用程序中的單點登錄(SSO)

用戶在訪問第三方SSO應用程序時進行身份驗證。 當用戶嘗試通過SSO訪問Web應用程序時,SSO應用程序通過HTTP請求向Web應用程序傳遞訪問令牌。附加到Web應用程序啓動URL的該令牌隨後由應用程序返回到SSO。 獲取訪問令牌後,將用戶數據以XML格式(包括用戶ID,名稱,角色)從Web應用程序傳遞到Web應用程序,該Web應用程序應該將其併入分析以授予用戶訪問權限。

以下是請求流程: 1)用戶導航到SSO登錄頁面並在那裏登錄。 2)給用戶一個鏈接到web應用程序並點擊它。 SSO創建訪問令牌並將訪問請求重定向到Web應用程序的登錄頁面(並添加訪問令牌)。 3)Web應用程序將令牌返回給SSO(並在需要時解析訪問令牌)。 4)SSO接收訪問令牌,檢索關聯的用戶數據(id,name,role),並向Web應用程序返回一個XML響應(帶有id,用戶名,角色)。 5)Web應用程序根據從XML文件中的角色獲取的聲明來建立標識和授權頁面。

如何做最後一步5? 可以使用什麼類/方法來解析用戶名和角色信息,以便像在STS認證之後那樣根據用戶名,角色來建立身份?

回答

1

從您的Web應用程序中,您將必須實現ClaimsAuthenticationManager和ClaimsAuthorisationManager。沿着這一行,但是你的要求的東西會從你的STS返回的令牌:

public class ClaimsTransformationModule : ClaimsAuthenticationManager 
    { 
     public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal) 
     { 
      if (!incomingPrincipal.Identity.IsAuthenticated) 
      { 
       return base.Authenticate(resourceName, incomingPrincipal); 
      } 

      return CreateApplicationPrincipal(incomingPrincipal.Identity.Name); 
     } 

     private ClaimsPrincipal CreateApplicationPrincipal(string userName) 
     { 
      var claims = new List<Claim>(); 
      claims.Add(new Claim(ClaimTypes.Name, userName)); 
      claims.Add(new Claim(ClaimTypes.GivenName, userName)); 
      // add roles 
      var roles = Roles.GetRolesForUser(userName).ToList(); 
      roles.ForEach( 
       r => claims.Add(new Claim(ClaimTypes.Role, r))); 

      return new ClaimsPrincipal(new ClaimsIdentity(claims, "Custom")); 
     } 

    } 


public class CustomAuthorisationManager : ClaimsAuthorizationManager 
{ 
    public override bool CheckAccess(AuthorizationContext context) 
    { 
     string resource = context.Resource.First().Value; 
     string action = context.Action.First().Value; 

     if (action == "Edit" && resource == "User") 
     { 
      bool isAdmin = context.Principal.HasClaim(ClaimTypes.Role, "Admin"); 
      return isAdmin; 
     } 

     return false; 
    } 
} 

您必須配置設置添加到您的web.config的

<configuration> 
    <configSections> 
    .. 
    <section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
    <section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
.. 

您可以使用聲明標記來存儲聲明以保存每次您的數據庫。

這篇文章是非常好的,可以解釋這一切從開始到結束:

http://dotnetcodr.com/2013/03/04/claims-based-authentication-in-mvc4-with-net4-5-c-part-3-claims-based-authorisation/

+0

什麼需要ClaimsPrincipal對象呢?如何在沒有ClaimsPrincipal的情況下調用Authenticate?也許我只需要CreateApplicationPrincipal()方法,因爲Web應用程序只包含用戶名,部門,子部門的字符串集?只要有索賠,當前授權工作良好。我需要CustomAuthorizationManager嗎?會話變量和Cookie在什麼時候製作? – ildar

相關問題