C# 如何在MVC应用程序上进行ADFS身份验证后向ClaimsPrincipal添加其他声明
我们有一个使用ADFS 4身份验证的MVC5 web应用程序。我正试图找到一个最佳位置,在身份验证完成后,我可以在ClaimsPrincipal中添加其他声明 是否有我可以访问的事件,如OnAuthenticated?如何访问此类事件 这是我在访问事件后打算使用的内容: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
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代码>给出了相同的结果。我猜这与我的项目中如何设置身份验证有关。你看到我的编辑了吗?