标签: owin

服务器端声称使用Owin身份验证进行缓存

我有一个过去常用的应用程序,FormsAuthentication不久之前我将其切换为使用IdentityModelfrom,WindowsIdentityFramework以便我可以从基于声明的身份验证中受益,但使用和实现它相当难看.所以现在我在看OwinAuthentication.

我在看OwinAuthenticationAsp.Net Identity框架.但是Asp.Net Identity框架目前唯一的实现是使用EntityModel和我正在使用nHibernate.所以现在我想尝试绕过Asp.Net Identity并直接使用Owin Authentication.我终于能够使用" 我如何忽略身份框架魔法并使用OWIN auth中间件来获取我所寻求的声明? "中的提示进行工作登录,但现在我持有声明的cookie相当大.当我使用时,IdentityModel我能够使用服务器端缓存机制来缓存服务器上的声明,而cookie只是为缓存的信息保存了一个简单的令牌.是否有相似的功能OwinAuthentication,或者我必须自己实现它?

我希望我会参加其中一艘船......

  1. cookie保持3KB,哦,它有点大.
  2. 启用类似于IdentityModelSessionCaching的功能Owin,我不知道.
  3. 编写我自己的实现来缓存导致cookie膨胀的信息,看看我是否可以Owin在应用程序启动时配置它.
  4. 我这样做是错的,有一种我没有想过的方法,或者我在滥用某些东西Owin.

    public class OwinConfiguration
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = "Application",
                AuthenticationMode = AuthenticationMode.Active,
                CookieHttpOnly = true,
                CookieName = "Application",
                ExpireTimeSpan = TimeSpan.FromMinutes(30),
                LoginPath = "/Login",
                LogoutPath = …
    Run Code Online (Sandbox Code Playgroud)

asp.net authentication claims-based-identity owin

32
推荐指数
2
解决办法
1万
查看次数

owin认证的当前用户

我开始为移动应用程序构建一个web api,我很难实现身份验证.我使用Bearer,虽然一切都应该没问题,但我无法让当前用户从控制器中获取动作.HttpContext.Current.User.Identity.Name为null(同样是HttpContext.Current.User.Identity.GetUserId())的结果.以下是重要代码:

Startup.cs:

    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            ConfigureAuth(app);
            WebApiConfig.Register(config);
            app.UseWebApi(config);
        }
    }
Run Code Online (Sandbox Code Playgroud)

Startup.Auth.cs

public partial class Startup
{
        static Startup()
        {
            OAuthOptions = new OAuthAuthorizationServerOptions
            {
                TokenEndpointPath = new PathString("/token"),
                Provider = new ApplicationOAuthProvider(),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
                AllowInsecureHttp = true
            };

            OAuthBearerOptions = new OAuthBearerAuthenticationOptions();
        }

        public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }
        public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; private set; }


        public static string PublicClientId { …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc owin

32
推荐指数
1
解决办法
4万
查看次数

OWIN中间件中的全局异常处理

我正在尝试在构建于OWIN中间件(使用Owin.Host.SystemWeb的IIS HOST)之上的ASP.NET Web API 2.1项目中创建统一的错误处理/报告.目前我使用了一个自定义异常记录器,它继承System.Web.Http.ExceptionHandling.ExceptionLogger并使用NLog记录所有异常,如下面的代码所示:

public class NLogExceptionLogger : ExceptionLogger
{

    private static readonly Logger Nlog = LogManager.GetCurrentClassLogger();
    public override void Log(ExceptionLoggerContext context)
    {
       //Log using NLog
    } 
}
Run Code Online (Sandbox Code Playgroud)

我想将所有API异常的响应主体更改为友好的统一响应,该响应使用System.Web.Http.ExceptionHandling.ExceptionHandler以下代码隐藏所有异常详细信息:

public class ContentNegotiatedExceptionHandler : ExceptionHandler
{
    public override void Handle(ExceptionHandlerContext context)
    {
        var errorDataModel = new ErrorDataModel
        {
            Message = "Internal server error occurred, error has been reported!",
            Details = context.Exception.Message,
            ErrorReference = context.Exception.Data["ErrorReference"] != null ? context.Exception.Data["ErrorReference"].ToString() : string.Empty,
            DateTime = DateTime.UtcNow
        };

        var response …
Run Code Online (Sandbox Code Playgroud)

asp.net-web-api owin katana asp.net-web-api2 owin-middleware

32
推荐指数
2
解决办法
2万
查看次数

如何使用ASP.NET身份(OWIN)访问Facebook私人信息?

我正在ASP.NET MVC 5中开发一个网站(目前使用RC1版本).该网站将使用Facebook进行用户身份验证和检索初始个人资料数据.

对于身份验证系统,我使用的是基于OWIN的新ASP.NET身份引擎(http://blogs.msdn.com/b/webdev/archive/2013/07/03/understanding-owin-forms-authentication-in-mvc -5.aspx),因为它极大地简化了与外部提供商进行身份验证的过程.

问题是,一旦用户首次登录,我想从Facebook个人资料中获取其电子邮件地址,但此数据不包含在生成的声明中.所以我考虑过这些替代方案来获取地址:

  1. 指示ASP.NET标识引擎将电子邮件地址包含在从Facebook检索的数据集中,然后转换为声明.我不知道这是否可行.

  2. 使用Facebook图形API(https://developers.facebook.com/docs/getting-started/graphapi)通过使用Facebook用户ID(包含在声明数据中)来检索电子邮件地址.但是,如果用户将其电子邮件地址设置为私有,则此操作无效.

  3. 使用Facebook图形API,但指定"我"而不是Facebook用户ID(https://developers.facebook.com/docs/reference/api/user).但是需要一个访问令牌,我不知道如何(或者根本不可能)检索ASP.NET用来获取用户数据的访问令牌.

所以问题是:

  1. 如何指示ASP.NET标识引擎从Facebook检索其他信息并将其包含在声明数据中?

  2. 或者,我如何检索生成的访问令牌,以便我自己可以询问Facebook?

谢谢!

注意:对于身份验证系统,我的应用程序使用基于此SO答案中链接的示例项目的代码:https://stackoverflow.com/a/18423474/4574

asp.net-mvc facebook-graph-api owin asp.net-mvc-5 asp.net-identity

31
推荐指数
4
解决办法
3万
查看次数

从OWIN中的OAuth Bearer Token获取IPrincipal

我已使用OWIN成功将OAuth添加到我的WebAPI 2项目中.我收到令牌,可以在HTTP Header中使用它们来访问资源.

现在,我想在其他通道上使用这些令牌进行身份验证,而不是为OWIN模板制作的标准HTTP请求.例如,我正在使用WebSockets,其中客户端必须发送OAuth承载令牌进行身份验证.

在服务器端,我通过WebSocket接收令牌.但是,我现在如何将此令牌放入OWIN管道以从中提取IPrincipal和ClientIdentifier?在WebApi 2模板中,所有这些都是为我抽象的,因此我无需做任何事情来使其工作.

所以,基本上,我将令牌作为字符串,并希望使用OWIN来访问该令牌中编码的用户信息.

提前感谢您的帮助.

.net c# oauth asp.net-web-api owin

31
推荐指数
2
解决办法
2万
查看次数

从外部身份验证提供程序获取MVC5框架OAuth/OWin身份提供程序的ExtraData

我正在尝试在VS 2013预览中使用新的MVC5框架.

会员身份验证框架已经过彻底检查并替换为OWin.

特别是,我打开了外部身份验证提供程序Google auth.

这很简单.

只需取消注释这一行: app.UseGoogleAuthentication();在新的默认MVC项目的App_Start目录中的Startup.Auth.cs文件中.

因此,我希望访问来自身份验证提供程序的"额外数据",例如用户的头像的URL以显示在我的应用程序中.

在针对asp.net成员资格提供程序的旧OAuth实现下,有一种方法可以使用此处的ExtraData字典来捕获它:ProviderDetail.ExtraData属性.

我找不到关于OAuth和OWin如何协同工作以及如何访问这些额外数据的文档.

任何人都可以开导我吗?

asp.net-mvc owin visual-studio-2013 asp.net-mvc-5 asp.net-identity

30
推荐指数
3
解决办法
2万
查看次数

Web API 2,OWIN身份验证,SignOut不会注销

我正在做一些研究工作,以便使用Bearer令牌作为身份验证机制(即AngularJS UI,通过Web API [2]项目中的OWIN进行身份验证).

我的登录工作正常,角色信息和一切都很好,但我无法获得登出令牌.

我的启动配置是这样的:

OAuthOptions = new OAuthAuthorizationServerOptions() {
    TokenEndpointPath = new PathString("/Token"),
    Provider = new ApplicationOAuthProvider(PublicClientId),
    AccessTokenExpireTimeSpan = SESSION_TIMEOUT,
    AllowInsecureHttp = true
};
Run Code Online (Sandbox Code Playgroud)

我的退出操作就是这样:

public HttpResponseMessage Logout() {
    var authentication = HttpContext.Current.GetOwinContext().Authentication;
    authentication.SignOut(DefaultAuthenticationTypes.ExternalBearer);

    return new HttpResponseMessage(HttpStatusCode.OK);
}
Run Code Online (Sandbox Code Playgroud)

为简洁起见,我已将所有身份验证内容留下,但确认我在设置令牌时使用的是ExternalBearer.

在我的UI中,我将令牌存储在本地存储中(此处不涉及cookie,这是一个深思熟虑的设计决策).所以我的UI上有一个注销按钮,注销Logout操作,代码运行正常.

但是,如果我随后打了上需要授权的API的行动,请求仍然可以通过(即用户通过身份认证,即使他们去应该已经退出.

要么我错过了一些非常明显的东西(不会是第一次;-)或者还有更基本的东西 - 最后我正在打@leastprivilege因为我知道这是他们的区域.

我们将非常感激地提供任何帮助或见解.


我唯一能想到的是令牌在服务器/ API端是无状态的,因此无法过期或退出.

如果是这种情况,我想我可以:

a)添加一个刷新令牌,创建一个过去到期的新令牌 - 这甚至可以工作吗? - 实际取消它,它会发出一个新的令牌......旧的令牌仍然有效

b)将持有者令牌存储在数据库中并每次检查,在注销时删除令牌(自然盐渍,散列等).然而,这只是让我们回到拥有状态服务器.

c)当有人明确注销时,我可以(并且将会)从本地存储中删除令牌,但是如果baddy可以拦截令牌,则令牌在技术上仍然有效.当然,以上所有都将通过SSL,这应该会抑制坏人/女孩.

d)也许这就是为什么很多人将持有者令牌存储在cookie中(作为存储机制),所以一旦你注销,cookie将在下次刷新时删除.

对不起,以上是一个大脑转储,只是想抢先问任何问题

authentication asp.net-web-api owin asp.net-web-api2

30
推荐指数
2
解决办法
3万
查看次数

SignalR MVC 5 Websocket没有有效的凭据

我尝试在MVC应用程序中使用SignalR.它工作正常,但我在Chrome控制台中收到以下错误

 WebSocket connection to 'ws://localhost:18245/signalr/connect?transport=webSockets&clientProtocol=1.4&connectionToken=bNDGLnbSQThqY%2FSjo1bt
8%2FL45Xs22BDs2VcY8O7HIkJdDaUJ4ftIc54av%2BELjr27ekHUiTYWgFMfG6o7RaZwhf
fpXavzWQ1jvkaxGm5rI%2BWtK7j0g1eQC2aOYP366WmRQLXCiYJfsm4EbwX6T8n2Aw
%3D%3D&connectionData=%5B%7B%22name%22%3A%22importerhub%
22%7D%5D&tid=9' failed: HTTP Authentication failed; no valid credentials available 
Run Code Online (Sandbox Code Playgroud)

有趣的是,我通过Hub从Controller调用的jquery方法运行正常.

jQuery的:

 $(function () {
            // Initialize the connection to the server
            var importerHub = $.connection.importerHub;

            // Preparing a client side function
            // called sendMessage that will be called from the server side
            importerHub.client.sendMessage = function (message) {
                showOrUpdateSuccessMessage(message);
            };
            $.connection.hub.start();
        });
Run Code Online (Sandbox Code Playgroud)

控制器:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<ImporterHub>();
            hubContext.Clients.All.sendMessage("All operations complete");
Run Code Online (Sandbox Code Playgroud)

我使用.Net v4.5.1,SignalR v2.1.2.0和IIS 8.5与Windows身份验证.

我该如何解决这个错误?

asp.net-mvc jquery controller signalr owin

30
推荐指数
1
解决办法
2万
查看次数

SignalR + Autofac + OWIN:为什么GlobalHost.ConnectionManager.GetHubContext不起作用?

我正在尝试在单个项目中使用OWIN,SignalR和Autofac.

我正在设置有关signalR的内容如下:

       // Create the AutoFac container builder:
        var builder = new ContainerBuilder();

        // ...[Register various other things in here]...

        // register signalR Hubs
        builder.RegisterHubs(Assembly.GetExecutingAssembly());

        // Build the container:
        var container = builder.Build();

        // Configure SignalR with the dependency resolver.
        app.MapSignalR(new HubConfiguration
        {
            Resolver =  new AutofacDependencyResolver(container)
        });
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我使用Autofac SignalR集成时,我不能再在服务器上获取signalR Hub Context(例如在webapi控制器中),因此无法从服务器端向连接的客户端发送消息.当我不使用Autofac signalR集成时,如下所示:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
hubContext.Clients.All.notification("Test Message");
Run Code Online (Sandbox Code Playgroud)

但是当我将Autofac添加到混合中时,这不起作用 - 我没有得到任何错误消息,我似乎得到了一个hubContext,但是对它的调用实际上似乎并没有到达客户端.

如果我在对MapSignalR的调用中注释掉了对signalR的依赖性解析器的使用,那么对GetHubContext的调用再次起作用并且消息成功地到达signalR客户端,但当然我不能再在我的集线器上使用IoC.例如

        // Configure SignalR with the dependency resolver.
        app.MapSignalR(new HubConfiguration
        {
            // Resolver =  new AutofacDependencyResolver(container)
        });
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么使用AutofacDependencyResolver会阻止GlobalHost.ConnectionManager.GetHubContext正常工作? …

asp.net autofac signalr owin

29
推荐指数
1
解决办法
7962
查看次数

为什么ASP.NET Core中的中间件需要特定的语义,而不是接口?

众所周知,ASP.NET Core中方法Configure(类Startup)的IApplicationBuilder需要特定的语义(使用HttpContext类型的输入参数和作为返回值的Task的方法'Invoke').但为什么它没有作为接口实现?我可以写类似的东西:

public class FakeMiddleware
{

}
Run Code Online (Sandbox Code Playgroud)

并注册:

    app.UseMiddleware<FakeMiddleware>();
Run Code Online (Sandbox Code Playgroud)

我们会得到一个运行时错误.当然,它是微不足道的东西,易于找到和修复,但它实现如此粗糙,没有界面?

middleware interface owin owin-middleware asp.net-core

29
推荐指数
2
解决办法
1476
查看次数