1

我们有一个使用 ADFS 4 身份验证的 MVC 5 Web 应用程序。在完成身份验证后,我正在尝试找到可以将其他声明添加到 ClaimsPrincipal的最佳位置。

有没有我可以访问的事件,例如 OnAuthenticated?如何访问此类活动?

这是我可以访问事件后打算使用的内容:

IOwinContext context = Request.GetOwinContext();

if (appRoles != null)
{
    ClaimsIdentity claimsIdentity = new ClaimsIdentity(System.Web.HttpContext.Current.User.Identity);

    foreach (var role in appRoles)
    {
        claimsIdentity.AddClaim(new Claim("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", role));
    }

    context.Authentication.AuthenticationResponseGrant = new AuthenticationResponseGrant
        (new ClaimsPrincipal(claimsIdentity), new AuthenticationProperties { IsPersistent = true });
}

编辑: 这是我的App_Data\Startup.Auth.cs文件的样子:

public partial class Startup
{
    private static string realm = ConfigurationManager.AppSettings["ida:Wtrealm"];
    private static string adfsMetadata = ConfigurationManager.AppSettings["ida:ADFSMetadata"];

    public void ConfigureAuth(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            CookieManager = new SystemWebCookieManager()
        });

        app.UseWsFederationAuthentication(
            new WsFederationAuthenticationOptions
            {
                Wtrealm = realm,
                MetadataAddress = adfsMetadata
            });
    }
}
4

1 回答 1

0

我遇到了类似的问题,并设法在我的 MVC 5 应用程序中登录 ADFS 后添加额外的声明。更多信息可以在msdn 链接上找到。

这是来自该链接的代码。首先创建新的 ClaimsAuthenticationManager 类并在里面设置额外的声明:

class SimpleClaimsAuthenticatonManager : ClaimsAuthenticationManager
{
    public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
    {
        if (incomingPrincipal != null && incomingPrincipal.Identity.IsAuthenticated == true)
        {
            ((ClaimsIdentity)incomingPrincipal.Identity).AddClaim(new Claim(ClaimTypes.Role, "User"));
        }
        return incomingPrincipal; 
    }
}

然后在 web.config 文件中指定这个类,在identityConfiguration元素下:

<system.identityModel>  
   <identityConfiguration>  
     <claimsAuthenticationManager type="ENTER YOUR NAMESPACE HERE.SimpleClaimsAuthenticatonManager, ENTER PROJECT NAME HERE" />  
     ...  
   </identityConfiguration>  
</system.identityModel> 
于 2020-02-07T12:21:23.097 回答