我将ASP.NET身份与ADFS服务器一起使用。出于开发目的,我想避免在我无法访问ADFS服务器的网络环境中使用ADFS服务器。这就是为什么我在我的HomeController中添加一个简单的控制器动作来手动设置当前登录用户的原因:
#if DEBUG
[AllowAnonymous]
public ActionResult LogIn()
{
var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.NameIdentifier, "tester"));
System.Web.HttpContext.Current.User = new ClaimsPrincipal(new ClaimsIdentity(claims));
System.Threading.Thread.CurrentPrincipal = System.Web.HttpContext.Current.User;
return Redirect("Home/Index");
}
#endif
和Owin配置方法:
public void Configuration(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions() { });
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
Wtrealm = realm,
MetadataAddress = adfsMetadata
});
}
评论我使用WsFederation身份验证的部分没有问题,这样就没有指向我当前ADFS服务器的链接。
问题:当我被重定向到Home / Index操作(具有Authorize属性)时,ASP.NET Identity不会将我的ClaimsPrincipal识别为有效登录,所以我是重定向到Home / Login操作,这会在Home / Login和Home / Index之间不断创建一个循环。
我的问题:如何让ASP.NET接受上面创建的ClaimsPrincipal作为有效登录?
答案 0 :(得分:8)
问题在于方法 - 未设置cookie,因此不会在HTTP请求中保留用户信息。您的方法仅适用于一次调用(有用途,但不适合您)
您仍然可以使用OWIN的IAuthenticationManager
来设置Cookie:
#if DEBUG
[AllowAnonymous]
public ActionResult LogIn()
{
var identity = new ClaimsIdentity("ApplicationCookie", ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType);
identity.AddClaim(new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "Active Directory"));
identity.AddClaim(new Claim(ClaimTypes.Name, "Testy McTestface"));
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, "testUser"));
IAuthenticationManager authenticationManager = HttpContext.GetOwinContext().Authentication;
authenticationManager.SignOut("ApplicationCookie");
authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, identity);
return Redirect("Home/Index");
}
#endif
你需要nuget包Microsoft.Owin.Security.Cookies
,
Microsoft.Owin.Host.SystemWeb
。请参阅我的blog-post中有关使用AD进行身份验证的更多说明
您还需要确保CookieAuthenticationMiddleware
配置为correclty:
public void Configuration(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "ApplicationCookie",
LoginPath = new PathString("/Home/Login"),
Provider = new CookieAuthenticationProvider(),
CookieName = "ApplicationCookie",
CookieHttpOnly = true,
ExpireTimeSpan = TimeSpan.FromHours(1),
});
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
Wtrealm = realm,
MetadataAddress = adfsMetadata
});
}
特别是对AuthenticationType
值进行身份验证 - 它必须与ClaimsIdentity
构造函数中的值匹配。否则cookie将不会被设置,或者您无法注销。