小编App*_*ere的帖子

OpenID Connect中ID令牌到期时间的意图是什么?

在OpenID Connect中,访问令牌具有到期时间.对于授权代码流,这通常很短(例如20分钟),之后您使用刷新令牌来请求新的访问令牌.

ID令牌还具有期满时间.我的问题是这是什么意思?

任何ID令牌到期时间小于刷新令牌的到期时间将意味着您最终将拥有一个过期的ID令牌,但是有效的访问令牌.

所以你的意思是:

  • 为您的ID令牌提供比刷新令牌到期更长的时间,或者
  • 将它设置为与访问令牌相同的到期时间并在其到期时执行某些操作(什么?),或者
  • 只是在收到时在客户端使用ID令牌,然后忽略之后的到期时间?

ID连接规范只是说,验证一个ID令牌时,

"The current time MUST be before the time represented by the exp Claim."
Run Code Online (Sandbox Code Playgroud)

哪(可能)支持上面的第三个选项.


编辑

由于OpenID Connect建立在OAuth2上,因此可以在OAuth2规范中找到以下补充问题的答案,该规范说,

expires_in
     RECOMMENDED.  The lifetime in seconds of the access token.
Run Code Online (Sandbox Code Playgroud)

一个相关的问题是当您为令牌交换授权代码时,相同的规范说您可能会收到如下响应:

{
 "access_token": "SlAV32hkKG",
 "token_type": "Bearer",
 "refresh_token": "8xLOxBtZp8",
 "expires_in": 3600,
 "id_token": "eyJhbG[...]"
}
Run Code Online (Sandbox Code Playgroud)

但是在这种情况下,"expires_in"与什么有关?访问令牌,刷新令牌或ID令牌?

(有关信息,IdentityServer3将此设置为访问令牌到期时间).

oauth-2.0 openid-connect

79
推荐指数
6
解决办法
3万
查看次数

一起使用承载令牌和cookie身份验证

我有一个单页应用程序 - 或多或少基于MVC5 SPA模板 - 使用承载令牌进行身份验证.

该网站还有一些传统的MVC页面需要保护,但使用cookie身份验证.

在Startup.Auth中,我可以启用两种类型的授权:

app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOAuthBearerTokens(OAuthOptions);
Run Code Online (Sandbox Code Playgroud)

但是,这似乎有副作用,因为无论何时从SPA发送AJAX请求,它都会在标头 cookie中发送承载令牌.

我真正想要的行为是,只有持有者令牌用于WebAPI调用,而只有用于MVC调用的cookie.

我还希望MVC调用在未经授权时重定向到登录页面(设置为CookieAuthenticationOption),但显然我不希望在进行API调用时发生这种情况.

有没有办法在一个应用程序中进行这种类型的混合模式身份验证?也许通过路径/路由过滤器?

asp.net-mvc oauth-2.0 asp.net-web-api owin

65
推荐指数
1
解决办法
3万
查看次数

在Entity Framework Code-First Initializer中设置数据库排序规则

我想在Entity Framework Code First创建数据库时设置数据库的默认排序规则.

我尝试过以下方法:

public class TestInitializer<T> : DropCreateDatabaseAlways<T> where T: DbContext
{
    protected override void Seed(T context)
    {
        context.Database.ExecuteSqlCommand("ALTER DATABASE [Test] SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
        context.Database.ExecuteSqlCommand("ALTER DATABASE [Test] COLLATE Latin1_General_CI_AS");
        context.Database.ExecuteSqlCommand("ALTER DATABASE [Test] SET MULTI_USER");
    }
}
Run Code Online (Sandbox Code Playgroud)

当SQL Server 设置为相同的默认排序规则Latin1_General_CI_AS 时,这似乎运行正常.

但是如果我指定了不同的排序规则,比如说SQL_Latin1_General_CP1_CI_AS 则会因错误而失败,

System.Data.SqlClient.SqlException: Resetting the connection results in a different 
state than the initial login. The login fails.
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议我如何设置校对吗?

sql-server ef-code-first entity-framework-4.1

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

添加的代码优先实体不是延迟加载属性

我有一个问题,即新添加的实体的属性不是延迟加载的,如果在添加实体后立即需要.

例如:

我有一个具有虚拟JobRole属性的User实体:

public class User
{
    public int Id { get; set; }

    public virtual JobRole JobRole { get; set; }
    public int JobRoleId { get; set; }

    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我添加一个新用户:

public User Add(User user)
{
    var addedUser = _myContext.Users.Add(user);
    myContext.SaveChanges();
    return addedUser;
}
Run Code Online (Sandbox Code Playgroud)

然后将返回的对新用户的引用传递给Razor视图,在该视图中它尝试显示JobRole(例如JobRole.Name).在将User传递给View时,它具有:

  • JobRoleId正确设置为整数值.
  • JobRole = null

然后我会期望JobRole在被View使用时被延迟加载,但它不会导致null引用异常.

这是预期的行为,还是有办法让新添加的实体延迟加载其属性?

提前感谢任何想法.

环境:使用Entity Framework 4.2代码优先.启用了延迟加载.

entity-framework lazy-loading code-first

14
推荐指数
1
解决办法
3322
查看次数

基于子实体的属性构建OrderBy Lambda表达式

我正在尝试OrderBy使用lambda表达式生成LINQ 子句,其中实体的列名称作为字符串的输入(在下面的"sortOn"变量中).

下面的代码适用于sortOn值,例如生成lambda的"Code"

p => p.Code
Run Code Online (Sandbox Code Playgroud)

但我还想对lambda可能存在的子实体进行排序

p => p.Category.Description
Run Code Online (Sandbox Code Playgroud)

所以在这个例子中,我只想设置sortOn ="Category.Description"并生成正确的lamdba表达式.

这可能吗?有关最佳方法的任何建议都会受到欢迎.

此代码适用于简单的情况:

var param = Expression.Parameter(typeof (Product), "p");

var sortExpression = Expression.Lambda<Func<Product, object>>(
    Expression.Property(param, sortOn), param);

if (sortAscending ?? true)
{
   products = products.OrderBy(sortExpression);
}
else
{
   products = products.OrderByDescending(sortExpression);
}
Run Code Online (Sandbox Code Playgroud)

此问题的用例是显示数据网格并能够对数据进行排序,只需将要排序的列名称传递回服务器即可.我想使解决方案通用,但现在已开始使用特定类型(示例中的产品).

c# linq lambda expression-trees

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

如何填充OwinContext.Request.Path和PathBase?

我正在根据Katana项目中的其他示例为OpenID Connect授权代码流编写自己的OWIN中间件.

作为其中的一部分,我必须构造一些URI,例如重定向URI和返回URL.

Katana中的其他示例通过连接当前请求中的部分来完成此操作,例如在CookieAuthenticationHandler中

loginUri =
    Request.Scheme +
    Uri.SchemeDelimiter +
    Request.Host +
    Request.PathBase +
    Options.LoginPath +
    new QueryString(Options.ReturnUrlParameter, currentUri);
Run Code Online (Sandbox Code Playgroud)

我的问题是什么规则管理两个路径属性中的最终结果:

OwinContext.Request.Path
OwinContext.Request.PathBase
Run Code Online (Sandbox Code Playgroud)

我已经尝试检查这些属性,因为请求通过下面管道中的不同处理程序,请求:

"https://localhost/Client/login" // Where Client is a virtual directory in IIS
Run Code Online (Sandbox Code Playgroud)

结果:

  • 在/ login的映射处理程序中,PathBase ="/ Client/Login".
  • 但是当请求到达同一请求的路上时,我的QuillCodeFlowHandler中的ApplyResponseChallengeAsync方法得到了,PathBase ="/ Client"和Path ="/ Login".

因此,如果不知道如何填充这些值的"规则",然后更改,则很难使用它们构造URI.如果有人能解释,将不胜感激.

我的配置的摘录是:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
    LoginPath = new PathString("/Login")
});

app.UseQuillCodeFlowAuthentication(new QuillCodeFlowOptions());

app.Map("/login", map =>
{
   map.Run(async ctx =>
   {
     if (ctx.Authentication.User == null ||
     !ctx.Authentication.User.Identity.IsAuthenticated)
     {                        
       var authenticationProperties = new AuthenticationProperties();
       [...] …
Run Code Online (Sandbox Code Playgroud)

owin katana openid-connect

10
推荐指数
1
解决办法
8617
查看次数

在哪里运行实体的重复检查

我正在寻找关于在MVC应用程序中使用Entity Framework Code-First时验证逻辑的"最佳"位置的建议,例如对实体的重复检查.

使用一个简单的例子:

public class JobRole
{
  public int Id { get; set; }        
  public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

规则是"名称"字段必须是唯一的.

当我添加一个新的JobRole时,很容易在Job Role Repository中运行一个名称尚不存在的检查.

但是,如果用户编辑现有JobRole,并意外将名称设置为已存在的名称,我该如何检查?

问题是存储库中不需要"更新"方法,因为作业角色实体将自动检测更改,因此在尝试保存之前没有合理的位置来执行此检查.

到目前为止,我考虑了两个选项:

  1. 覆盖DbContext上的ValidateEntry方法,然后在使用EntityState.Modified保存JobRole实体时,运行重复检查.
  2. 在尝试保存之前,创建一些从Controller调用的重复检查服务.

两者都不是真的很理想.使用ValidateEntry似乎相当晚(在保存之前)并且难以测试.使用服务可能会有人忘记从控制器调用它,让重复的数据通过.

有没有更好的办法?

.net validation asp.net-mvc design-patterns entity-framework

8
推荐指数
2
解决办法
6551
查看次数

角色提供程序是否按请求缓存?

我的MVC应用程序在单个页面请求期间在多个位置使用用户角色.我的问题是默认的SqlRoleProvider是否在页面请求的生命周期中缓存当前用户的角色?

例如,我在Controller方法的属性中使用Roles:

[Authorize(Roles = "Admin")]
Run Code Online (Sandbox Code Playgroud)

和自定义代码

if (user.IsInRole(MembershipRole.Admin))
{
     // Do something
}
else if (user.IsInRole(MembershipRole.Printer))
{
     // Do something else
}
Run Code Online (Sandbox Code Playgroud)

如果角色提供程序不缓存角色,是编写从默认角色继承的自定义角色提供程序的最佳解决方案,并覆盖方法以获取角色一次并在请求持续时间内缓存它们?这可以通过Authorize属性和我自己的代码都将使用缓存的角色来完成吗?

(如果您想知道,我不想使用cacheRolesInCookie web.config选项来缓存cookie中的角色).

在此先感谢您的任何建议.

[编辑以包含Joe回答触发的详细信息]

我反编译了System.Web.Mvc.AuthorizeAttribute,AuthorizeCore方法为每个要检查的角色调用以下方法:

httpContext.User.IsInRole
Run Code Online (Sandbox Code Playgroud)

然后窥视System.Web.Security.RolePrincipal(这就是"User"在上面),下面的方法确实使用了用户角色的缓存副本(或者如果为空则填充缓存):

public string[] GetRoles()
public bool IsInRole(string role)
Run Code Online (Sandbox Code Playgroud)

缓存作为字段存储在User上,因此其生命周期是在请求期间.

方法使用以下方法查找角色:

Roles.Providers[this._ProviderName].GetRolesForUser(this.Identity.Name)
Run Code Online (Sandbox Code Playgroud)

因此将使用您为应用程序选择的任何角色提供程序(默认或自定义).

asp.net asp.net-mvc roleprovider sqlroleprovider

8
推荐指数
1
解决办法
3071
查看次数

使用JavaScript创建OpenXML文档

我有一个应用程序需要使用JavaScript创建简单的OpenXML文档(特别是PowerPoint演示文稿).

任何人都可以建议如何开始这个(或者即使有可能)?我使用Microsoft OpenXML SDK使用C#做类似的事情,并且想知道是否有任何具有类似功能的JavaScript库.

基本上问题是如何创建组成解压缩的PowerPoint文档的单个OpenXML文档,然后将它们压缩在一起以创建PowerPoint(.pptx)文件,然后有人可以将其保存到磁盘.

欢迎任何想法!

javascript powerpoint openxml

7
推荐指数
1
解决办法
3441
查看次数

如何使用VirtualPathUtility.GetAbsolute方法在单元测试代码时模拟上下文

我正在对使用VirtualParthUtility.GetAbsolute的代码运行单元测试,但是在模拟上下文时遇到了问题.

我已经用Moq设置了一个模拟上下文,如下所示

    private Mock<HttpContextBase> MakeMockHttpContext(string url) // url = "~/"
    {
        var mockHttpContext = new Mock<HttpContextBase>();

        // Mock the request
        var mockRequest = new Mock<HttpRequestBase>();
        mockRequest.Setup(x => x.ApplicationPath).Returns("/");
        mockRequest.Setup(x => x.Path).Returns("/");
        mockRequest.Setup(x => x.PathInfo).Returns(string.Empty);
        mockRequest.Setup(x => x.AppRelativeCurrentExecutionFilePath).Returns(url);

        mockHttpContext.Setup(x => x.Request).Returns(mockRequest.Object);

        // Mock the response
        var mockResponse = new Mock<HttpResponseBase>();
        mockResponse.Setup(x => x.ApplyAppPathModifier(It.IsAny<string>())).Returns((string s) => s);

        mockHttpContext.Setup(x => x.Response).Returns(mockResponse.Object);

        return mockHttpContext;
    }
Run Code Online (Sandbox Code Playgroud)

并将其附加到MVC控制器

_myController.ControllerContext = new ControllerContext(MakeMockHttpContext("~/").Object, new RouteData(), _slideSelectorController);
Run Code Online (Sandbox Code Playgroud)

测试期间运行的代码命中行:

venue.StyleSheetUrl = VirtualPathUtility.ToAbsolute(venue.StyleSheetUrl); // input like "~/styles/screen.css"
Run Code Online (Sandbox Code Playgroud)

每次运行时,它都会进入System.Web.VirtualPathUtility,问题是返回的"VirtualParthString"总是抛出异常:

 public static …
Run Code Online (Sandbox Code Playgroud)

model-view-controller unit-testing moq mocking

6
推荐指数
1
解决办法
2559
查看次数