最近我读了很多关于OWIN和Katana的内容,并尝试过" 使用OWIN自我托管ASP.NET Web API " 等示例.
我目前对于是否可以使用这些技术来托管现有的WebForms ASP.NET应用程序而不使用任何IIS,完全在桌面应用程序(WinForms或控制台)中是无能为力的.
也就是我拥有的东西:

(用户通过Internet上的Web浏览器访问的现有Web应用程序)
这就是我想要实现的目标:

(相同的现有Web应用程序文件,在Katana进程中本地托管,并通过localhost URL通过Web浏览器访问)
这对我们的应用程序的两个版本(Web和Windows)很有帮助.
我的问题:
今天或不久的将来有可能创造这样的场景吗?
我目前正在使用OWIN将WebApi 1移动到WebApi 2项目.
在这段代码中,GlobalConfiguration位于System.Web.Http.WebHost中.
public class HandlerErrorFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
var logFactory = GlobalConfiguration.Configuration.DependencyResolver
.GetService(typeof(ILoggerFactory)) as ILoggerFactory;
...
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这不是Owin兼容,但我找不到如何重写这个,所以我可以访问依赖解析器.
我正在尝试设置一个自托管的OWin应用程序(使用VS2012)-我认为它已经关闭,因为我可以从包含.csproj的目录中运行OwinHost.exe,并且应用程序可以从localhost:5000正确进行服务。我创建了一个默认的nuspec文件,并添加了以下内容
<files>
<file src="bin\*.dll" target="bin" />
<file src="views\home\home.html" target="content" />
<file src="web.config" target="content" />
</files>
Run Code Online (Sandbox Code Playgroud)
在AssemblyInfo.cs中
[assembly: OwinStartup(typeof(TestA.Startup))]
Run Code Online (Sandbox Code Playgroud)
当我安装软件包(nuget install mypackage)时,出现以下错误...
从默认端口开始:5000 ...
Error: System.ArgumentException
No conversion available between
System.Func`2[System.Collections.Generic.IDictionary`2[System.String,System.Object],
System.Threading.Tasks.Task] and Microsoft.Owin.OwinMiddleware.
Parameter name: signature
Run Code Online (Sandbox Code Playgroud)
让我知道您是否需要更多信息
干杯!
我正在使用VS2013 ASP.NET SPA模板作为我的Web应用程序的起点,它使用新的ASP.NET身份框架.这是来自模板:
public partial class Startup
{
static Startup()
{
UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());
....
}
Run Code Online (Sandbox Code Playgroud)
因此,由于没有将DbContext传递到上面的UserStore构造函数,这表明正在创建一个新的DbContext.由于我也想利用数据上下文(对于请求期间的其他数据操作),我稍微更改了模板代码:
public partial class Startup
{
public static DerivedDbContext=null;
static Startup()
{
context = new DerivedDbContext();
UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>(context));
...
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以通过以下方式从我的任何控制器使用相同的DbContext:
Startup.context
Run Code Online (Sandbox Code Playgroud)
但是,当多个请求同时进入时我遇到了麻烦,因为无关的操作发生在同一个DbContext中.从这里开始,我向我指出,我不应该在应用程序的整个生命周期中实例化单个DbContext,而只是为了特定请求的生命周期,所以我将实例化移动到控制器的构造函数,但现在,我在控制器中有自己的DbContext,而UserManager仍然有自己的(并且在Startup类中创建).
为什么模板为所有用户(在Startup类中)实例化了一次UserManager?值得关注的是,通过在控制器构造函数中创建自己的DbContext,有两个DbContexts(我在控制器的构造函数中创建的那个,以及在UserManager中创建的那个,在Startup类中创建的)同时播放?在所有请求中共享一个UserManager是否可以接受,但在一般情况下在所有请求中共享一个DbContext是不可接受的?
有两个单独的上下文似乎是愚蠢的,我注意到我有时会得到一个不同步的数据视图.我想了解是否有其他人在使用此模板时遇到此问题.
**编辑:我理解像nInject这样的IOC框架可能有助于在这种情况下管理对象生命周期,但我想首先了解如何在没有这种框架的帮助下实现这一目标.
谢谢... - 贝恩
entity-framework asp.net-web-api katana visual-studio-2013 asp.net-identity
我正在开发一个webapi项目,现在我们正在迁移到owin-katana自托管.OwinMiddleware的行为与MessageHandlers相同.所以我的问题是,如果我们使用Owin-katana托管,那么我们是否需要在webapi中使用OwinMiddleware而不是消息处理程序?
请澄清 ?
我在我的web api授权中使用OWIN/Katana中间件.
流动.
我发布acess_token和refresh_token请求的客户端.
将access_token有短暂的寿命,而refresh_token早已到期.
像往常一样,如果access_token到期,它将使用refresh_token请求另一个access_token.
现在,我的问题.由于我的refresh_token有很长的生命周期,看起来它失败了短命的access_token的目的.让我们说如果refresh_token被泄露,黑客仍然可以得到access_token,对吧?
我查看了谷歌和微软的OAuth实现,看起来他们还有这个额外的参数,你需要提供除了refresh_token.这就是client_id和client_secret.看起来它们是在API的开发者页面上登录时生成的.
现在,我如何在我的项目中实现它?我想要覆盖令牌创建并使令牌哈希基于ClientId和ClientSecret.
我正在使用最新的web api的基本OWIN/Katana身份验证,我不打算使用像Thinktecture这样的其他授权服务器.我只想使用ASP.NET Web API 2默认提供的基本功能
Startup.OAuth.cs
public partial class Startup
{
static Startup()
{
PublicClientId = "self";
UserManagerFactory = () => new UserManager<IdentityUser>(new AppUserStore());
var tokenExpiry = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["ApiTokenExpiry"]);
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(tokenExpiry),
AllowInsecureHttp = true,
RefreshTokenProvider …Run Code Online (Sandbox Code Playgroud) 我有OWIN服务器作为控制台应用程序的一部分.你可以在这里看到主要方法:
class Program
{
public static ManualResetEventSlim StopSwitch = new ManualResetEventSlim();
static void Main(string[] args)
{
Console.CancelKeyPress += (s, a) =>
{
a.Cancel = true;
StopSwitch.Set();
};
using (WebApp.Start<Startup>("http://+:8080/"))
{
Console.WriteLine("Server is running...");
Console.WriteLine("Press CTRL+C to stop it.");
StopSwitch.Wait();
Console.WriteLine("Server is stopping...");
}
Console.ReadKey();
Console.WriteLine("Server stopped. Press any key to close app...");
}
}
Run Code Online (Sandbox Code Playgroud)
当请求的处理稍微长一点并且同时用户按下CTRL + C以停止应用程序时,立即停止请求处理并且不发送响应.是否有可能改变这种行为?我想拒绝所有新请求,但要等到当前正在处理的请求完成并在此之后停止服务器.
我最初的想法是创建OWIN中间件,它将跟踪当前正在处理的请求并推迟停止操作直到一切都完成.中间件还会在停止阶段将所有请求短路.但这个解决方案对我来说听起来不太好.
有很多样本在线使用OWIN/Katana根据用户名/密码组合在数据库中查找用户并生成索赔主体,例如...
var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);
// generate claims here...
Run Code Online (Sandbox Code Playgroud)
如果您正在创建一个新的应用程序并希望实体框架执行脏工作,那就没问题.但是,我有一个八年历史的单片网站刚刚更新,使用基于声明的身份验证.我们的数据库命中是通过DAL/SQL手动完成的,然后从那里生成ClaimsIdentity.
有些人建议OWIN比我们的手动方法更容易使用,但我想从那些使用它的人那里得到一些输入.
是否可以根据凭据更改UserManager工厂查找用户的方式?或者,我错过了另一种方法吗?我在网上找到的所有样本似乎都使用样板方法让Entity Framework创建数据库并管理搜索.
在Brock Allen的博客中,他表示
CookieAuthenticationOptions类具有Provider属性...并且它具有您可以订阅的委托的属性.这允许您在进入应用程序时验证cookie(OnValidateIdentity).在此回调中,您可以拒绝或替换身份.
我是OWIN和C#的新手,所以我正在努力调整OnValidateIdentity我在网上发现的许多例子以满足我的需求.在每个"私人"网页上接受cookie有效后,我想检查以下内容:
我可以用普通方法实现这两个检查,但我无法弄清楚如何挂钩登录OnValidateIdentity.这是我到目前为止所拥有的:
我写了一些代码,但无法弄清楚需要从使用的方法返回什么.
public void Configuration(IAppBuilder app)
{
dynamic cookieExpirationPeriod = TimeSpan.FromMinutes(60);
CookieAuthenticationProvider prov = new CookieAuthenticationProvider();
prov.OnValidateIdentity = ctx =>
{
MyClaimsIdentityObject si = MyApp.Identity.Current();
if (si == null || si.UserId == 0 || si.CustomerId == 0) {
ctx.RejectIdentity();
// what needs to happen here for a return value?
}
};
CookieAuthenticationOptions coa = new CookieAuthenticationOptions {
AuthenticationMode = AuthenticationMode.Active,
CookieName = "MyApp",
ExpireTimeSpan = cookieExpirationPeriod,
SlidingExpiration = …Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用Katana来公开自托管WebAPI服务的应用程序.我想管理内容的方式与IIS在单个网站下允许多个应用程序的方式类似.
例如,我可能有三个包含web api内容的文件夹:
这些文件夹中的每一个都是独立的应用程序,包括web.config,控制器,路由等.
我可以为每个实例生成一个新的Owin实例,但这需要单独的端口.使用IIS,我可以配置单独的应用程序,以便http:// localhost:8080/App1将路由到第一个应用程序,http:// localhost:8080/App2将路由到第二个应用程序,依此类推.与Owin/Katana有什么相似之处吗?