C# 如何在MVC应用程序上进行ADFS身份验证后向ClaimsPrincipal添加其他声明

C# 如何在MVC应用程序上进行ADFS身份验证后向ClaimsPrincipal添加其他声明,c#,asp.net-mvc,owin,adfs,adfs4.0,C#,Asp.net Mvc,Owin,Adfs,Adfs4.0,我们有一个使用ADFS 4身份验证的MVC5 web应用程序。我正试图找到一个最佳位置,在身份验证完成后,我可以在ClaimsPrincipal中添加其他声明 是否有我可以访问的事件,如OnAuthenticated?如何访问此类事件 这是我在访问事件后打算使用的内容: IOwinContext context = Request.GetOwinContext(); if (appRoles != null) { ClaimsIdentity claimsIdentity = new

我们有一个使用ADFS 4身份验证的MVC5 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\u 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
            });
    }
}

我遇到了类似的问题,并设法在我的MVC5应用程序中ADFS登录后添加其他声明。有关更多信息,请访问

下面是来自该链接的代码。 首先创建新的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> 

...  

我遇到了类似的问题,并设法找到了在我的MVC 5应用程序中ADFS登录后添加附加声明的方法。有关更多信息,请访问

下面是来自该链接的代码。 首先创建新的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> 

...  

该项目是几年前创建的。直到几周前才有这种需要。而且奥温/卡塔纳似乎不再流行了。也许我们需要切换到另一个客户端身份验证库?这个项目是几年前创建的。直到几周前才有这种需要。而且奥温/卡塔纳似乎不再流行了。也许我们需要切换到另一个客户端身份验证库?尝试了此操作,但未将索赔添加到索赔列表中。至少它没有出现在
@foreach(System.Security.Claims.Claims.ClaimsPrincipal.Current.Claims中的System.Security.Claims.Claims-Claim-Claim-Claim-Claim-Claim-Claim)
中-我的web.config中没有
System.identityModel
。它曾经在我以前的项目中,但VS并没有在新项目中添加它。所以我只是手动添加了它。不确定您为当前用户获取声明的逻辑,以前从未使用过它。下面是我使用的:var identity=(ClaimsIdentity)User.identity;IEnumerable claims=identity.claims<代码>变量标识=(ClaimsIdentity)User.identity;IEnumerable claims=identity.claims给出了相同的结果。我猜这与我的项目中如何设置身份验证有关。您看到我的编辑了吗?尝试了此操作,但未将索赔添加到索赔列表中。至少它没有出现在
@foreach(System.Security.Claims.Claims.ClaimsPrincipal.Current.Claims中的System.Security.Claims.Claims-Claim-Claim-Claim-Claim-Claim-Claim)
中-我的web.config中没有
System.identityModel
。它曾经在我以前的项目中,但VS并没有在新项目中添加它。所以我只是手动添加了它。不确定您为当前用户获取声明的逻辑,以前从未使用过它。下面是我使用的:var identity=(ClaimsIdentity)User.identity;IEnumerable claims=identity.claims<代码>变量标识=(ClaimsIdentity)User.identity;IEnumerable claims=identity.claims给出了相同的结果。我猜这与我的项目中如何设置身份验证有关。你看到我的编辑了吗?