如何向Windows Identity Foundation(WIF)声明添加角色

时间:2014-04-14 07:55:17

标签: c# asp.net webforms wif claims-based-identity

我需要将一个STS(安全令牌服务)添加到ASP.NET Webforms网站。主要问题是我需要在身份验证发生后为角色添加声明,因为身份提供者没有角色信息。

我使用类似下面的代码在本地STS中实现了CustomSecurityTokenService。这段代码按预期工作 - 无论如何,我需要在稍后的过程中添加评论“在这里为用户获取角色”中的位。

        // Get the incoming identity 
        IClaimsIdentity callerIdentity = (IClaimsIdentity)principal.Identity;

        // Issue custom claims.
        ClaimsIdentity outputIdentity = new ClaimsIdentity("Federation");

        var username = callerIdentity.Name;
        var domain = "DOMAIN";

        outputIdentity.Claims.Add(new Claim(ClaimTypes.Name, callerIdentity.Name));
        outputIdentity.Claims.Add(new Claim(ClaimTypes.WindowsAccountName, string.Format("{0}\\{1}", domain, username)));


        // get roles for user here:
        var roles = "Admin"; 

        string[] rolelist = roles.Split(',');

        foreach (var role in rolelist)
        {
            outputIdentity.Claims.Add(new Claim(ClaimTypes.Role, role));
        }

        return outputIdentity;

我遇到的问题是,我目前无法获得角色,因为它们是由身份提供商以外的服务提供的。我需要等到我回到RP(应用程序)才能获得它 - 但到那时,web.config中的安全设置已经锁定了我,因为我的角色设置。

 <location path="Pages/Secure/Messages/Default.aspx">
        <system.web>
            <authorization>
                <allow roles="Admin, Tecchies"/>
            </authorization>
        </system.web>
    </location>

我认为我可以在global.asax中使用一个事件,但到目前为止我还没有任何选择可以使用。类似这样的代码:

var currentUser = Service.GetUser(callerIdentity.Name);
foreach (var role in currentUser.Roles) 
{
           outputIdentity.Claims.Add(new Claim(ClaimTypes.Role, role));
}

我正在使用.NET 4.0 - 虽然我知道升级到4.5可能会有一些好处,但目前这不是我的选择。

我已经花了一个年龄,所以任何帮助都感激不尽!

1 个答案:

答案 0 :(得分:1)

在查看this linkthis link后,我最终找到了答案。

我最初没有得到的一件事是,为了使用ClaimsAuthenticationManager,你需要在<microsoft.identityModel><services>部分的web.config中添加额外的行来连接实现

因此:

  <claimsAuthenticationManager type="MyCustomClaimsAuthenticationManager" />

我想知道为什么我的代码永远不会被执行..