(ASP.NET MVC 5,EF6,VS2013)
我试图弄清楚如何在类型中将"Id"字段的类型从字符串更改为int:
Microsoft.AspNet.Identity.EntityFramework.IdentityUser
Run Code Online (Sandbox Code Playgroud)
为了使新用户帐户与整数ID而不是GUID相关联.但似乎这比在我的派生用户类中简单地添加类型为int的新Id属性更复杂.看看这个方法签名:
(来自程序集Microsoft.AspNet.Identity.Core.dll)
public class UserManager<TUser> : IDisposable where TUser : global::Microsoft.AspNet.Identity.IUser
{
...
public virtual Task<IdentityResult> AddLoginAsync(string userId, UserLoginInfo login);
...
}
Run Code Online (Sandbox Code Playgroud)
因此,似乎ASP.NET身份框架中还有其他方法要求userId为字符串.我还需要重新实现这些课程吗?
解释为什么我不想在用户表中存储id的GUID:
- 将有其他表通过外键将数据与users表相关联.(当用户在网站上保存内容时.)我认为没有理由使用较大的字段类型并花费额外的数据库空间而没有明显的优势.(我知道还有其他关于使用GUID和int ID的帖子,但似乎有很多人建议int id更快并且使用更少的空间,这仍然让我感到疑惑.)
- 我计划公开一个restful端点,以允许用户检索有关特定用户的数据.我认为:
/users/123/name
Run Code Online (Sandbox Code Playgroud)
比...更干净
/users/{af54c891-69ba-4ddf-8cb6-00d368e58d77}/name
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么ASP.NET团队决定以这种方式实现ID?在尝试将其更改为int类型时,我是否只是短视?(也许我缺少一些好处.)
谢谢...
-ben
asp.net-mvc entity-framework owin asp.net-mvc-5 asp.net-identity
(使用VS2013 RTW,ASP.NET MVC5)
我在使用ASP.NET标识时看到了很多关于如何向ApplicationUser类(和表)添加属性的文档.但是我没有看到任何关于如何通过外键将内容映射到ApplicationUser表的单独表格的文档.
我已经成功地派生了我自己的Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext,现在我自己的"UserPreferences"表与我的SQL Server数据库中的各种"AspNet*"表共存.但我不清楚获取当前用户ID的最佳方法,以便在"UserPreferences"表中写入新行.请注意,该项目是ASP.NET MVC,但我已添加(并且正在使用)Web API控制器.
我有一个有效的解决方案,它是:
var uman = new Microsoft.AspNet.Identity.UserManager<Microsoft.AspNet.Identity.EntityFramework.IdentityUser>(new Microsoft.AspNet.Identity.EntityFramework.UserStore<Microsoft.AspNet.Identity.EntityFramework.IdentityUser>(new App1.Data.App1DbContext()));
var uident = User.Identity;
var userobject = uman.FindByNameAsync(uident.Name);
var userid = userobject.Result.Id;
// (Perform new row creation including the userid we just looked up
Run Code Online (Sandbox Code Playgroud)
考虑到AspNetUsers表(由Identity框架定义)包含以下字段:
-id (PK, nvarchar(128) - seems to contain a GUID, not sure why not an autoincrement integer, but I assume there are reasons for this)
-Username (nvarchar(max))
-PasswordHash (nvarchar(max))
-SecurityStamp (nvarchar(max))
Run Code Online (Sandbox Code Playgroud)
我认为id字段(不是用户名)是此表中引用的正确字段.(我当时认为用户可能会更改他/她的用户名,然后其他人就可以假设其他用户的用户名,这就是为什么两个字段都可能存在的原因.)那么,我需要获取当前用户的存储空间ID. "UserPreferences"表,这是上面的代码所做的.但是,进行此查找似乎效率低下.
重要的一点是,在System.Web.Mvc.Controller的上下文中,我可以这样做:
User.Identity.GetUserId()
(Runtime type of User.Identity: System.Security.Principal.GenericIdentity) …Run Code Online (Sandbox Code Playgroud) asp.net-mvc asp.net-web-api owin visual-studio-2013 asp.net-identity
最新的ASP.NET身份位(2.0 beta)包含确认用户电子邮件地址的基础.NuGet包"Microsoft Asp.Net Identity Samples"包含显示此流程的示例.但在该示例中,即使EmailConfirmed = false在用户体验中也没有不同的行为.
如何在用户尚未确认电子邮件地址时阻止用户登录?我知道我可以让用户登录,然后执行对该EmailConfirmed字段的检查,但是如果我可以阻止用户成功登录时效果会更好EmailConfirmed == false
我有一个div列表,允许我的用户通过发布新内容动态添加新的div.如果用户发布新内容,我想通过将新div的背景颜色淡化为另一种颜色并将其淡化来在屏幕上突出显示它.我非常接近:
http://jsfiddle.net/pUeue/1953/
我正在使用这个CSS来触发转换:
.backgroundAnimated{
background-color: #AD310B !important;
background-image:none !important;
-webkit-transition: background-color 5000ms linear;
-moz-transition: background-color 5000ms linear;
-o-transition: background-color 5000ms linear;
-ms-transition: background-color 5000ms linear;
transition: background-color 5000ms linear;
-webkit-animation-direction: alternate; /* Chrome, Safari, Opera */
animation-direction: alternate;
-webkit-animation-iteration-count: 2; /* Chrome, Safari, Opera */
animation-iteration-count: 2;
}
Run Code Online (Sandbox Code Playgroud)
我可以褪色到另一种颜色,但它不会消退.我想知道是否有人有建议要做到这一点?我意识到有很多方法可以做到这一点,但我希望完全包含在CSS中(除了通过jQuery动态添加CSS类).
谢谢你的任何建议......
在ASP.NET 2.0身份阿尔法附带了新的中间件来管理得到的一个实例UserManager(app.UseUserManagerFactory设置此)和获得的一个实例DbContext(app.UseDbContextFactory设置此).有一个示例显示如何使用MVC应用程序,但没有关于如何从使用的SPA模板获得此工作的文档OAuthBearerTokens,与示例不同.
我目前陷入困境:
UserManagerFactory = () => new DerivedUserManager(new CustomUserStore(new CustomDbContext()));
OAuthOptions = new Microsoft.Owin.Security.OAuth.OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new MyApp.Web.Api.Providers.ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};
app.UseOAuthBearerTokens(OAuthOptions);
Run Code Online (Sandbox Code Playgroud)
并且不知道如何UserManagerFactory使用2.0 alpha样本中的这些调用替换上述内容,同时仍然OAuthBearerTokens使用SPA模板中使用的对象:
app.UseDbContextFactory(ApplicationDbContext.Create);
// Configure the UserManager
app.UseUserManagerFactory(new IdentityFactoryOptions<ApplicationUserManager>()
{
DataProtectionProvider = app.GetDataProtectionProvider(),
Provider = new IdentityFactoryProvider<ApplicationUserManager>()
{
OnCreate = ApplicationUserManager.Create
}
});
Run Code Online (Sandbox Code Playgroud)
谢谢... - 贝恩
我安装了昨天发布的VS2013最终位,我正试图在我启用外部Facebook登录的地方工作.我的第一个问题:
在这个控制器代码中(我没有触摸并保留原样来自示例模板):
//
// GET: /Account/ExternalLoginCallback
[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
if (loginInfo == null)
{
return RedirectToAction("Login");
}
Run Code Online (Sandbox Code Playgroud)
我在行上设置断点等待AuthenticationManager.GetExternalLoginInfoAsync().代码返回(在我登录Facebook之后),"loginInfo"为null.在UI中,继续显示登录页面,不做任何更改.我该怎么调试呢?我试图找到GetExternalLoginInfoAsync()内部的代码,但根据这个线程:
Asp.Net Identity RTM版本中的Microsoft.AspNet.Identity.Owin.AuthenticationManager在哪里?
AuthenticationManager现在已经不存在了.(上面似乎并非如此.)
我的第二个问题:是否有其他人能够使用Facebook登录而不更改ASP.NET MVC5示例代码(除了取消注释app.UseFacebookAuthentication并填写您的FB应用程序详细信息)?(您必须使用Facebook配置别名主机,例如"localtest.me",并使用IIS express配置它.)
谢谢你的帮助...
-ben
ASP.NET团队已经发布了新示例,展示了如何使用身份包.它们包含在以下nuget包中:Microsoft Asp.Net Identity Samples
这些示例非常有用,但是在发布的模板中最初的工作方式发生了很多变化.
我的具体问题:在原始SPA模板中,有以下代码:
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};
...
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(OAuthOptions);
Run Code Online (Sandbox Code Playgroud)
但是在nuget包中的新样本中,该代码已经消失了,取而代之的是这段代码:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature …Run Code Online (Sandbox Code Playgroud) 我有一个部署到Azure的ASP.NET网站.我正在使用VS2013,.NET 4.5.1和Azure SDK 2.2.我在管理门户中打开了VS2013的远程调试.我可以成功右键单击服务器中"Azure"节点下的网站,然后选择"附加调试器".它说它正在下载调试设置,然后Web浏览器出现.但是断点永远不会被击中,尽管它们处于我知道执行的代码中.一条线索:断点有一个空心圆圈,并指出:"断点当前不会被命中.此文档没有加载任何符号." 但是在本地测试时,断点工作正常.有没有人对如何解决这个问题有任何想法?
谢谢...
-ben
更新:我从.NET 4.5.1下降到4.5; 问题依然存在.
在ASP.NET核心标识中添加声明很简单,但我无法找到如何添加基于临时会话的声明.
我的用例是,具有自己的自定义声明的登录用户需要定期添加新声明,但仅限于当前会话,而不是持久保存到数据库.关闭浏览器或退出后,临时声明应该消失.
这是为了满足一种机制,该机制临时更改用户所属的组织,以便在我正在迁移到asp.net Core的应用程序中进行模拟.
我在这里找到了很多关于GenerateUserIdentityAsync在以前版本的Identity中实现这一点的建议,但在新版本中似乎没有.
c# asp.net asp.net-mvc asp.net-identity asp.net-core-identity
想象一下以下代码:
$.get( "ajax/getColorData.php", function( data ) {
this.colorData = data;
});
Run Code Online (Sandbox Code Playgroud)
现在设想'数据'的价值是:
this.colorData = [
{
colorName: 'Red',
colorIsInRainbow:true
},
{
colorName: 'Orange',
colorIsInRainbow: true
},
{
colorName: 'Magenta',
colorIsInRainbow: false
}
];
Run Code Online (Sandbox Code Playgroud)
问题1
现在,在我下载数据之后,假设我想为数组中的每个条目添加一个方法"colorStartsWithR".我"想"而不是在数组的每个成员上定义它,我可以在原型上以某种方式定义这个方法.但是,我不确定我能做到这一点,因为这些对象不是由我创建的,而是由$ .get返回的,所以我不清楚我是否正在思考正确的方向.
问题2
更进一步,如果我想为数组的每个成员添加一个属性,具体如下:
{
colorName: 'Magenta',
colorIsInRainbow: false,
userClickedThisColor:ko.observable()
}
Run Code Online (Sandbox Code Playgroud)
这样,我可以绑定(通过knockoutjs)列表并包含一个复选框.在这种情况下,我质疑原型是否会派上用场,因为每个成员都应该获得自己的ko.observable属性.一个快速的本能是做一些事情:
for (var i=0;i<this.colorData.length;i++)
{
this.colorData[i].userClickedThisColor=ko.observable()
}
Run Code Online (Sandbox Code Playgroud)
并且工作正常,但想象一下,有多种方法可以检索颜色列表,或者用户可以创建新的颜色实例,并且我在上面做的自定义更复杂.我现在需要复制上面的"附加"逻辑.有更聪明的方法吗?
我把大部分时间花在强类型语言上,有时这些事情对我来说并不那么明显.谢谢你的任何建议......
-ben