为什么OWIN的SignInAsync()没有设置IsAuthenticated(或其他身份验证变量)?

lev*_*nja 5 .net authentication owin asp.net-identity

我有一个.NET,MVC 5,EF 6项目.我们正在连接到外部项目/数据库来验证用户,因此我们需要实现的只是登录和注销方法,而不是普通的CRUD方法.我知道我已经将EF正确映射到外部数据库的表中; 我可以看到它得到了用户.

我正在尝试使用OWIN进行身份验证,以便我可以使用[Authorize]整个控制器方法中的属性.我一直在关注这个作为我的向导.

在Startup.Auth.cs我有:

    app.CreatePerOwinContext<CustomUserManager>(CustomUserManager.Create);
    app.CreatePerOwinContext<CustomSignInManager>(CustomSignInManager.Create);
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Account/Login"),
        Provider = new CookieAuthenticationProvider
        {
            OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                validateInterval: TimeSpan.FromMinutes(30),
                regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)
            )
        },
        CookieSecure = CookieSecureOption.Always
    });
Run Code Online (Sandbox Code Playgroud)

我也有类实现接口IUserStore<User>,UserManager<User>SignInManager<User, string>.我CustomUserStore实现了以下方法,因为源代码说它是如何登录的.我实现了其他功能(即虚拟方法DeleteAsync(),UpdateAsync()不需要实施,等等),因为我们只读到这个外部用户数据库访问...

    public async Task<User> FindByIdAsync(string id)
    {
        using (ExternalDBContext context = new ExternalDBContext())
        {
            return await Task.Run(() =>
                context.Users.Where(u => u.Id == id).ToList().FirstOrDefault()
            );
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后在我的AccountController.Login()我有:

        await CustomSignInManager.SignInAsync(model, true, true);
        return RedirectToAction("Index", "Dashboard");
Run Code Online (Sandbox Code Playgroud)

但之后SignInAsync(),User.Identity.IsAuthenticated仍然是false因此没有授权的属性将无法正常工作.

#1可能的问题: 我想知道,如果问题是AuthenticationManager,这SignInManager依赖.以下是我在Startup.Auth.cs中实现它的方法:

public class CustomSignInManager : SignInManager<User, string>
{
    public CustomSignInManager(CustomUserManager userManager, IAuthenticationManager authenticationManager)
        : base(userManager, authenticationManager)
    {
    }
    public static CustomSignInManager Create(IdentityFactoryOptions<CustomSignInManager> options, IOwinContext context)
    {
        return new CustomSignInManager(context.GetUserManager<CustomUserManager>(), context.Authentication);
    }
}
Run Code Online (Sandbox Code Playgroud)

Microsoft.Owin.Security.AuthenticationManager从上下文中得到一个.

那么:我是否需要做其他事情来实现身份验证?

#2可能的问题:我注意到我CustomUserManager的房产SupportsUserLogin = false. 该属性需要实现IUserLoginStore.我不想实现另一个无用的界面,其中包含我不使用的方法!

那么:这有关系SupportsUserLogin = false吗?我需要实现该接口还是有办法解决这个问题?

总结:总的来说,对于一个我想要做的就是登录用户的项目来说,这已经太复杂了.然后出去 我不想创建/更新/删除用户.我只想记录用户,User.Identity.IsAuthenticated = true直到他们退出.因此,任何关于如何回溯到更简单的使用Identity框架的方法的想法都将受到极大的赞赏.我最大的问题是我是否会走正路.

编辑: 我绝对不想做#2(实现IUserLoginStore),因为那是用于进行外部身份验证.

paj*_*ics 1

你使用 https 吗?如果不删除此行:CookieSecure = CookieSecureOption.Always

也不需要 IUserLoginStore (这只适用于像 facebook 这样的外部身份验证)更多信息:这里

旁注:将 Task.Factory.StartNew 更改为 Task.Run链接