gpt4 book ai didi

c# - 解决在上下文中找不到owin.Environment项目

转载 作者:行者123 更新时间:2023-12-02 14:00:17 27 4
gpt4 key购买 nike

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

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

No owin.Environment item was found in the context

经过大量调试和搜索,我发现 Startup 类没有被调用。我尝试通过逐步执行 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")
});
}
}
}

AccountController

    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>

关于c# - 解决在上下文中找不到owin.Environment项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35494921/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com