解决在上下文中找不到 owin.Environment 项

Resolve No owin.Environment item was found in the context

我发现很多线程都在讨论这个问题,但到目前为止我还没有让它们中的任何一个起作用。

我一直在尝试遵循 ProDinner 作为学习如何在我的应用程序中实现基于角色的身份验证的一种方式。但我无法弄清楚我错过了什么。每次我尝试登录时,我都会得到

No owin.Environment item was found in the context

经过大量调试和搜索,我发现 Startup class 没有被调用。我试图通过逐步查看 proDinner 代码来解决 Startup 是如何被调用和搜索的(很多!)。我的搜索引导我添加(尽管 proDinner 项目中都不存在)

<add key="owin:AutomaticAppStartup" value="Tjs.Startup, Tjs" />

然后

<add key="owin:AutomaticAppStartup" value="Tjs.Web.Admin.Startup, Tjs" />

下面我添加了所有我认为是相关的代码,但如果我遗漏了什么,请告诉我。

AccountController 是 ProDinner 的复制粘贴,添加了一个无参数构造函数,我无法弄清楚该参数是如何在 Prodinner 项目中传递的(这可能是问题所在吗?)

Tjs: 解决方案名称

Tjs.Web.Admin: 命名空间

Owin 包

<package id="Microsoft.Owin" version="3.0.1" targetFramework="net45" />
<package id="Microsoft.Owin.Host.SystemWeb" version="3.0.1" targetFramework="net45" />
<package id="Microsoft.Owin.Security" version="3.0.1" targetFramework="net45" />
<package id="Microsoft.Owin.Security.Cookies" version="3.0.1" targetFramework="net45" />
<package id="Microsoft.Owin.Security.OAuth" version="3.0.1" targetFramework="net45" />

项目根目录

using Microsoft.Owin;
using Owin;

using Tjs.Web.Admin;
using Tjs.Web.Admin.App_Start;

[assembly: OwinStartup(typeof(Startup))]
namespace Tjs.Web.Admin
{
  public class Startup
  {
    public void Configuration(IAppBuilder app)
    {
        OwinConfig.ConfigureAuth(app);
    }
  }
}

App_Start

using Microsoft.AspNet.Identity;
using Microsoft.Owin;
using Microsoft.Owin.Security.Cookies;
using Owin;
namespace Tjs.Web.Admin.App_Start
{
  public static class OwinConfig
  {
    public static void ConfigureAuth(IAppBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/SignIn")
        });
    }
  }
}

账户控制器

    private readonly IUserService userService;
    public AccountController()
    {

    }

    public AccountController(IUserService userService)
    {
        this.userService = userService;
    }

    private IAuthenticationManager Authentication
    {
        get
        {
            return HttpContext.GetOwinContext().Authentication;
        }
    }

    private void SignInOwin(string name, bool rememberMe, string role)
    {
        var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, name) },
            DefaultAuthenticationTypes.ApplicationCookie,
                ClaimTypes.Name, ClaimTypes.Role);

        //foreach (var role in roles)
        //{
        //    identity.AddClaim(new Claim(ClaimTypes.Role, role));
        //}
        identity.AddClaim(new Claim(ClaimTypes.Role, role));

        Authentication.SignIn(new AuthenticationProperties
        {
            IsPersistent = rememberMe
        }, identity);
    }

    public ActionResult SignIn()
    {
        return View(new SignIn { Email = "o", Password = "1" });
    }

    [HttpPost]
    public ActionResult SignIn(SignIn input)
    {
        if (!ModelState.IsValid)
        {
            input.Password = null;
            input.Email = null;
            return View(input);
        }

        Staff staff;

        //ACHTUNG: remove this in a real app
        if (input.Email == "o" && input.Password == "1")
        {
            staff = new Staff { Email = "o", Role = new Role { Description = "admin" } };
        }
        else
        {
            staff = userService.Get(input.Email, input.Password);
        }

        if (staff == null)
        {
            ModelState.AddModelError("", "Try Login: o and Password: 1");
            return View();
        }

        SignInOwin(staff.Email, input.Remember, staff.Role.Description);


        return RedirectToAction("index", "home");
    }

    public ActionResult SignOff()
    {
        Authentication.SignOut();
        return RedirectToAction("SignIn", "Account");
    }
}

失败于

private IAuthenticationManager Authentication
{
    get
    {
        return HttpContext.GetOwinContext().Authentication;
    }
}

将此添加到您的 web.config <appSettings><add key="owin:AppStartup" value="[Namespace].Startup, [AssemblyName]" /></appSettings>

我已经添加到 "web.config"

<modules runAllManagedModulesForAllRequests="true">

我遇到了同样的问题,我向 WebConfig 添加了一个新密钥 owin:AutomaticAppStartup 以便自动加载 Startup class。

<add key="owin:AppStartup" value="[Namespace].Startup,[AssemblyName]" />
<add key="owin:AutomaticAppStartup" value="true"/>