2013-02-25 3 views
0

Как я могу изменить значение открытого токена, исходящее из acs, с помощью ClaimsAuthenticationManager.I хочу добавить роль в token.i, чтобы добавить роль в идентификатор заявки, но она не отражена в исходном токене ,Пользовательская авторизация с использованием ClaimsAuthorizationManager

string rawToken = string.Empty; 

ClaimsIdentity identity = HttpContext.User.Identity as ClaimsIdentity; 

if (null != identity) 
{ 
    SimpleWebToken token = identity.BootstrapToken as SimpleWebToken; 

    if (null != token) 
    { 
     rawToken = token.RawToken; 
    } 
    } 

Роль отражаются на идентичности, но его не получает добавлен в начальных загрузках маркеров.

ответ

0

Точка самозагрузки используется для создания ClaimIdentity. В ClaimsAuthenticationManager у вас уже есть incomingPrincipal, созданный из токена ACS. Также претензии внутри токена подписываются ACS и теоретически не могут быть изменены без проблемы проверки на потребителе токенов.

Какой сценарий вы пытаетесь реализовать? Повторное использование токена в службе WCF или подобное?

ОБНОВЛЕНИЕ Вот пример кода для изменения токена из ACS (с токеном SAML2). NB: Очень важно, чтобы утверждения SAML с разными данными имели разные идентификаторы. Если вы реализуете схему, в которой загружается утверждение «шаблон» и заполняются определенные биты данных, идентификатор должен быть изменен, иначе в отладчике вы увидите измененные значения подтверждения, но метод WriteToken будет записывать оригинальный немодифицированный токен из исходных байтов, хранящихся внутри токена ,

X509Certificate2 singingCertificate = new X509Certificate2(certificateFile, certificatePassword); 
Saml2SecurityTokenHandler handler = CreateTokenHandler(); 
Saml2SecurityToken baseToken = GetTemplateToken(); 
Saml2Assertion assertion = templateToken.Assertion; 

//modify template token - change date, add claims etc 
assertion.Id = new Saml2Id(); 
//order is important, because in sampleToken this property is already setup and NotBefore date can not be NotOnOrAfter 
assertion.Conditions.NotOnOrAfter = DateTime.MaxValue; 
assertion.Conditions.NotBefore = DateTime.UtcNow; 

//prepare to resign token assertions 
X509AsymmetricSecurityKey signingKey = new X509AsymmetricSecurityKey(singingCertificate); 
X509RawDataKeyIdentifierClause x509clause = new X509RawDataKeyIdentifierClause(singingCertificate); 
SecurityKeyIdentifier keyIdentifier = new SecurityKeyIdentifier(new SecurityKeyIdentifierClause[] { x509clause }); 
assertion.SigningCredentials = new SigningCredentials 
    (
    signingKey, 
    assertion.SigningCredentials.SignatureAlgorithm, 
    assertion.SigningCredentials.DigestAlgorithm, 
    keyIdentifier 
    ); 
//create and sign modified token 
Saml2SecurityToken token = new Saml2SecurityToken(assertion, new ReadOnlyCollection<SecurityKey>(new List<SecurityKey>() { signingKey }), templateToken.IssuerToken); 
+0

http://code.msdn.microsoft.com/windowsazure/ASPNET-Security-SWT-With-a0183e7a/view/SourceCode#content – tony

+0

http://code.msdn.microsoft.com/windowsazure/ ASPNET-Security-SWT-With-a0183e7a/view/SourceCode # (это то, что я пытаюсь реализовать). Я сделал часть аутентификации с тем же подходом, что и в msdn link.Но я пытаюсь авторизовать пользователя в покое сценарий на стороне сервера. Для этого я использовал Claimauthenticationmanager для изменения претензий. Я могу добавить роль в значение претензии, но не отражающеся на токене, исходящем из acs.only, мне удалось добавить роль в идентификаторе. – tony

+0

Если вы действительно хотите изменить токен, вы должны сменить его с помощью закрытого ключа сертификата ACS после изменения. Или вы можете отключить проверку токена со стороны службы, но это будет означать, что токен используется как стандартный контейнер для претензий. –

Смежные вопросы