我刚刚将我的代码从 Identity 1.0.0 完全迁移到 2.0.0 & 由于某种原因,我遇到了一个奇怪的问题。尝试创建用户时,失败。错误是:电子邮件不能为空或为空。(当然,我将有效的电子邮件插入到该属性中)。请帮忙..
控制器.cs
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser()
{
UserName = model.UserName,
contact_firstname = model.contact_firstname,
contact_lastname = model.contact_lastname,
Email = model.Email,
PhoneNumber = model.PhoneNumber,
contact_phone2 = model.contact_phone2,
street = model.street,
city = model.city,
country = model.country,
state = model.state,
postcode = model.postcode,
longitude = model.longitude,
latitude = model.latitude
};
var result = await UserManager.CreateAsync(user, model.Password);
//HERE IS THE ERROR
if (result.Succeeded)
{
string …Run Code Online (Sandbox Code Playgroud) 我尝试运行两个安装了 Identity 2.0 的新 ASP.NET MVC5 项目的 2 个实例。这两个应用程序都是使用默认的 MVC 模板创建的,并设置为单独的身份验证,无需任何代码修改。
我在 Visual Studio 2013 RC2 中运行了第一个应用程序,并使用 Web 应用程序注册界面创建了一个虚拟用户帐户。完成上述步骤后,Entity 框架将使用虚拟用户登录信息创建一个虚拟数据库。然后我登录第一个应用程序,登录信息显示在主页的标题上。
接下来我在visual studio的下一个实例中运行第二个mvc应用程序,当网页启动时,我很惊讶我已经登录到没有任何数据库的第二个应用程序。我不知道怎么了。在 _LoginPartial.cshtml 下,以下代码检查用户是否已通过身份验证并显示注销链接。@if (Request.IsAuthenticated)
如果在不同的浏览器上运行相同的测试,则不会出现问题。我猜想与 cookie 或浏览器缓存有关。我可以知道如何避免上述情况的发生吗?还是应该是正常的?
我正在寻找关于如何在多层环境中实现ASP.NET身份2的一些指导.我有一个物理上分离的表示和业务层,但我在Identity中看到的所有示例和示例代码都涉及从表示层到DB使用EF.我没有直接点击数据库,而是将一组WCF服务作为我的业务层(非常典型,我敢肯定).我很擅长在底部使用EF作为ORM,但仅限于Web服务,而不是表示层.
我假设最直接的方法是拥有IUser*Store接口的自定义实现,然后这些实现将调用后端Web服务.
这是推荐的方法,还是有不同的方法?这似乎是合适的,因为这似乎是实现自己的自定义用户存储的推荐方法,但是必须实现所有这些接口似乎相当沉重(我知道大多数是可选的,但我需要大部分接口).
我正在使用Asp.NET Identity 2.1.0,我存储了Accounts一个User可以访问的列表,作为声明.该ClaimsIdentity时生成User迹象:
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add Claims concerning Account
userIdentity.AddClaim(new Claim("AccountList", SerializedListOfAccounts));
return userIdentity;
}
Run Code Online (Sandbox Code Playgroud)
假设管理员撤销User A对特定帐户的访问权限.我User A该如何强制再生ClaimsIdentity呢?请记住,它不是在上下文中User A.我不想等到cookie过期(并ClaimsIdentity自动生成一个新的.
可能吗?有没有办法告诉服务器将User Acookie视为无效并强制它重新生成?
我想要这种行为的原因是创建一个自定义AuthorizeAttribute,我可以放在我的控制器上,检查Claims是否User有访问权限,以避免额外的数据库往返.
背景: 我正在构建越来越多的 Web 应用程序,其中设计者/模板制作者决定添加“个人资料图片”和一些其他用户相关数据,当然只有在有人登录时才添加。
与大多数 ASP.NET MVC 开发人员一样,我使用视图模型来提供 razor 布局,其中包含我需要显示的信息,这些信息来自存储库等。
通过使用可以很容易地显示用户名
HttpContext.Current.User.Identity.Name
Run Code Online (Sandbox Code Playgroud)
如果我想在这些页面上显示我的支持数据存储中保存的信息,该怎么办?ApplicationUser 类中的自定义字段,例如业务部门名称或个人资料图片 CDN url。
(为了简单起见,我们假设我将身份框架与包含我的应用程序用户的实体框架(SQL 数据库)一起使用)
问题
你如何解决这个问题:
我考虑过使用新的视图模型的部分 - 但这仍然会在每次页面加载时往返 SQL 数据库。会话数据目前是安全的,但是当在天蓝色中扩展时,这也不是一种方法。知道我最好的选择是什么吗?
太长了;
如果用户登录(匿名访问=允许),我想在应用程序的每个页面上显示用户配置文件信息(ApplicationUser)。如何显示此信息而不在每个页面请求都查询数据库?如果没有 Session 类,我该如何做到这一点?在不构建基类的情况下如何做到这一点?
我想将查看可由授权和匿名用户访问的网页的数据库(日期和用户)保存在数据库中。有没有一种方法可以使操作同时使用这两种类型,因为如果操作是[AllowAnonymous],则用户未经身份验证,我无法检索用户 ID,如果操作是[Authorize]匿名用户,则无法访问该页面。
[HttpGet]
[Route("{id}/Detail")]
[AllowAnonymous]
[ResponseType(typeof(JsonArticleDetail))]
public IHttpActionResult GetArticle(int id)
{
...
var entity = this.DbContext.Articles.Find(id);
var applicationUserId = User.Identity.IsAuthenticated ? User.Identity.GetUserId() : null;
entity.ArticleViews.Add(new ArticleView
{
ViewedOn = DateTime.UtcNow,
ApplicationUserId = applicationUserId
});
this.DbContext.SaveChanges();
return Ok(article);
}
Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用asp.net identity 2.0进行身份验证(Owin中间件).会话劫持:当我登录身份创建AspNet.ApplicationCookie.然后,我复制了AspNet.ApplicationCookie值.然后我从应用程序注销.登出后,我手动创建cookie(AspNet.ApplicationCookie)并进行刷新它重定向我回家页.
权限提升:同时我以用户AI身份登录(AspNet.ApplicationCookie)登录了他的cookie并且我登出了.我以用户BI身份登录后正在编辑用户B Cookie并粘贴用户A cookie并保存.刷新浏览器后,我可以获得UserA访问和身份验证.
我正在清除所有会话并删除所有cookie当我退出.Even Asp.Net身份(Owin)每次都会生成新的AspNet.ApplicationCookie.但它仍然接受旧的cookie并给我一个访问权限.我不会知道为什么吗?任何人都可以告诉我如何在注销后使旧的AspNet.ApplicationCookie无效.这是我在Startup.Auth.cs中的代码
public void ConfigureAuth(IAppBuilder app)
{
// Enable the application to use a cookie to store information for the signed in user
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login")
});
// Use a cookie to temporarily store information about a user logging in with a third party login provider
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
}
Run Code Online (Sandbox Code Playgroud)
//这是注销码
public ActionResult LogOff ( )
{
//Delete all cookies while user log out
string[] myCookies = Request.Cookies.AllKeys;
foreach …Run Code Online (Sandbox Code Playgroud) 我正在使用 vs2013 并使用 asp.net mvc 5 创建我的 Web 应用程序。为了进行个人身份验证,我正在使用Identity 2.0。
当我创建我的 Entitymodel.edmx 时,它会自动在 web.config 中为我的数据库生成新的连接字符串,如下所示:
<add name="myEntities" connectionString="metadata=res://*/Models.mEntity.csdl|res://*/Models.mEntity.ssdl|res://*/Models.mEntity.msl;provider=System.Data.SqlClient;provider connection string="data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\Shop.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)
我想Identity使用代码优先方法来创建数据库并连接到另一个连接字符串(DefaultConnection),例如:
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-testauthentication-20151116011628.mdf;Initial Catalog=aspnet-testauthentication-20151116011628;Integrated Security=True"
providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)
因此,当我第一次运行项目时,它会创建新的.mdf文件,名称为
aspnet-testauthentication-20151116011628.mdf
并在其中创建表。但我想要的是让Identity连接到我已经创建的名为 : Shop.mdf 的数据库并在其中创建它的表。所以我把我的连接字符串名称ApplicationDbContext放在 IdentityModel.cs 的类中,如下所示:
public ApplicationDbContext()
: base("myEntities", throwIfV1Schema: false)
{
}
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
实体类型 ApplicationUser 不是当前上下文模型的一部分。
那么这样做的适当和正确的方法是什么?
多谢
更新:
我在现有数据库和DefaultConnection 中使用完全相同的名称创建了 Identity 表以连接到现有数据库,现在我收到此错误:
无法创建文件 'c:\users\mohamad\documents\visual studio 2013\Projects\Shop\Shop\App_Data\Shop.mdf',因为它已经存在。更改文件路径或文件名,然后重试该操作。创建数据库失败。无法创建列出的某些文件名。
为什么当有数据库甚至表时,身份尝试创建数据库?
解决方案:
第 1 …
所以我一直在搜索Google和SO.这个问题的感觉已被多次询问,但没有答案对我有帮助,但我觉得我已经接近了.但是,我是LINQ和Lambda的新手,并且没有做我想做的事情的知识.
User Roles
-----------------------------------------
John Admin
Jane Staff, HR, Payroll
MyCoolUserName User
Run Code Online (Sandbox Code Playgroud)
public class UsersViewModel {
[Display(Name = "User")]
public ApplicationUser User { get; set; }
[Display(Name = "Roles")]
public string Roles { get; set; }
}Run Code Online (Sandbox Code Playgroud)
此解决方案返回角色的空白,我不得不将其添加到我的web.config文件中:<roleManager enabled="true" />
public class UsersController : Controller {
public async Task Index() {
var allUsers = await db.Users.ToListAsync();
var users = new List();
foreach (var user in allUsers) {
String[] …Run Code Online (Sandbox Code Playgroud) 我正在使用身份框架实现一个新的授权 API。但是,我们有我们的用户表,我正在尝试将用户信息添加到 AspNetUsers 表中。
问题
asp.net ×6
c# ×3
asp.net-mvc ×2
cookies ×1
lambda ×1
linq ×1
owin ×1
razor ×1
sql-server ×1
wcf ×1