如何手动设置登录的身份用户?

时间:2016-07-14 09:54:43

标签: c# asp.net asp.net-identity

我将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作为有效登录?

1 个答案:

答案 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.CookiesMicrosoft.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将不会被设置,或者您无法注销。