本文将带您了解关于asp.net-mvc–实体框架种子与身份(Microsoft.Owin.Security)用户的新内容,另外,我们还将为您提供关于asp.net–MicrosoftMVC“echo
本文将带您了解关于asp.net-mvc – 实体框架种子与身份(Microsoft.Owin.Security)用户的新内容,另外,我们还将为您提供关于asp.net – Microsoft MVC“echo / print / output”等、asp.net – System.Web.Security.AntiXss.AntiXssEncoder与Microsoft.Security.Application.AntiXssEncoder、asp.net – 不明确的引用问题(Microsoft.AspNet.Identity和Microsoft.AspNet.Identity.Core)、asp.net – 如何访问Microsoft.Owin.Security.xyz OnAuthenticated上下文AddClaims值?的实用信息。
本文目录一览:- asp.net-mvc – 实体框架种子与身份(Microsoft.Owin.Security)用户
- asp.net – Microsoft MVC“echo / print / output”等
- asp.net – System.Web.Security.AntiXss.AntiXssEncoder与Microsoft.Security.Application.AntiXssEncoder
- asp.net – 不明确的引用问题(Microsoft.AspNet.Identity和Microsoft.AspNet.Identity.Core)
- asp.net – 如何访问Microsoft.Owin.Security.xyz OnAuthenticated上下文AddClaims值?
asp.net-mvc – 实体框架种子与身份(Microsoft.Owin.Security)用户
这是Migration类:
internal sealed class Configuration : DbMigrationsConfiguration<DatabaseContext> { public Configuration() { AutomaticMigrationsEnabled = true; } protected override void Seed(DatabaseContext context) { base.Seed(context); var userStore = new UserStore<ApplicationUser>(); var manager = new UserManager<ApplicationUser>(userStore); var role = new IdentityUserRole { Role = new IdentityRole(Model.Roles.ADMINISTRATOR) }; var user = new ApplicationUser() { UserName = "123123",Email = "123123@123.com",Language = "en-US"}; user.Roles.Add(role); IdentityResult result = manager.Create(user,"123123"); var role2 = new IdentityUserRole { Role = new IdentityRole(Model.Roles.norMAL) }; var user2 = new ApplicationUser() { UserName = "qweqwe",Email = "qweqwe@qweqwe.com",Language = "fr-CA" }; user.Roles.Add(role2); IdentityResult result2 = manager.Create(user2,"qweqwe"); } }
以下是ApplicationUser类,它定义Identity模型的自定义字段.
public class ApplicationUser : IdentityUser,ICurrentUser { public ApplicationUser() { Email = ""; Language = ""; } public string UserId { get { return base.Id; } set{} } public string Email { get; set; } public string Language { get; set; } }
以下是此新类的Entity Framework配置类.
public class ApplicationUserConfiguration : EntityTypeConfiguration<ApplicationUser> { public ApplicationUserConfiguration() { this.HasKey(d => d.Id); this.Ignore(d => d.UserId); } }
两者都使用具有相同配置的save DataContext:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); //... others entity here modelBuilder.Configurations.Add(new ApplicationUserConfiguration()); //Theses configuration are required since custom fields are added to ApplicationUser. Here is why : https://stackoverflow.com/questions/19474662/map-tables-using-fluent-api-in-asp-net-mvc5-ef6 modelBuilder.Entity<IdentityUserLogin>().HasKey(l => l.UserId); modelBuilder.Entity<IdentityRole>().HasKey(r => r.Id); modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId,r.UserId }); }
我的问题是:为什么我有从Identity表复制的AspNet前缀表名?为什么种子在Web应用程序使用另一种时使用一种?
解决方法
如果从IdentityDbContext继承,则不需要在OnModelCreating中进行任何其他配置. IdentityDbContext提供的映射和默认的实体框架约定应该足够了.
如果在没有UserId的setter的情况下声明ApplicationUser,则不需要忽略UserId属性:
public class ApplicationUser : IdentityUser { public ApplicationUser() { Email = ""; Language = ""; } public string Email { get; set; } public string Language { get; set; } public string UserId { get { return Id; } } }
然后你的ApplicationDbContext可以这么简单(为了清楚起见,我已将Configuration类重命名为MigrationConfiguration):
public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { static ApplicationDbContext() { Database.Setinitializer(new MigrateDatabasetoLatestVersion<ApplicationDbContext,MigrationConfiguration>()); } public ApplicationDbContext() : base("DefaultConnection") { } }
这与AspNet.Identity.Core和AspNet.Identity.EntityFramework程序集的发行版本(版本1.0.0)一样正常工作(只有名为AspNetXXXX的表,AspNetUsers表具有自定义字段).
asp.net – Microsoft MVC“echo / print / output”等
<%= Person.Name %>
对于webforms来说很好,因为很多模型数据都以编程方式绑定到控件上.但是对于MVC,我们现在更多地使用这种语法.
我遇到的问题非常简单,但无论如何都很烦人.这似乎打破了标记,即:
<% foreach(var Person in People) { %> <%= Person.Name %> <% } %>
这对我来说似乎有很多开关标签!
MVC contrib中的其他视图引擎有一种吐出到屏幕的方法,不使用标准关键字打开和关闭脚本标记,例如“print,out,echo”,即(brail示例):
<% for element in list: output "<li>${element}</li>" end %>
现在,我说这看起来似乎微不足道,但这种方式似乎更具可读性.那么具有这种语法的MS有什么优势,而不提供输出方法呢?
干杯,克里斯.
解决方法
<% foreach(var Person in People) { Response.Write(Person.Name); } %>
我相信这会奏效. (虽然我还没有测试过;我刚开始使用MVC而且办公室里没有工具集.)
编辑:我显然错过了实际的问题……
总结
以上是小编为你收集整理的asp.net – Microsoft MVC“echo / print / output”等全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
asp.net – System.Web.Security.AntiXss.AntiXssEncoder与Microsoft.Security.Application.AntiXssEncoder
最新版本的AntixssLibrary是4.2.1.
我非常困惑我在新项目中用于编码输出HTML的类型:内置System.Web.Security.Antixss.AntixssEncoder或来自AntixssLibrary的Microsoft.Security.Application.AntixssEncoder.有人会告诉我什么类型是首选使用,为什么?
解决方法
如果设置< httpRuntime encoderType>设置如http://www.asp.net/aspnet/overview/aspnet-45/whats-new#_Toc318097382所述,那么您只需使用内置的编码例程,如HttpUtility.HtmlEncode,实现将由Anti-XSS库提供.
asp.net – 不明确的引用问题(Microsoft.AspNet.Identity和Microsoft.AspNet.Identity.Core)
我在尝试实现身份验证时遇到的问题是我需要使用这两个命名空间:
Microsoft.AspNet.Identity //Version 3.0.0-beta4 Microsoft.AspNet.Identity.Owin //Version 2.2.1
但由于Microsoft.AspNet.Identity.Owin具有依赖性
Microsoft.AspNet.Identity.Core
我不断得到模糊的引用问题,例如对于Microsoft.AspNet.Identity和Microsoft.AspNet.Identity.Core中存在的UserManager.
之前还有其他人处理过这件事吗?
它是版本不兼容问题还是仅仅是不完整的Owin ASP.NET 5实现?
解决方法
只需引用Microsoft.AspNet.Identity即可.
asp.net – 如何访问Microsoft.Owin.Security.xyz OnAuthenticated上下文AddClaims值?
我可以看到我正在期待的数据正在登录时返回,并在Starup.Auth.cs中作为声明添加.但是,当我在帐户控制器内时,唯一出现在UserManager或UserStore中的声明是由LOCAL AUTHORITY发行的.没有找到Facebook(或其他外部提供商)的索赔.索赔附加在哪里上下文? (我在使用VS2013 RTM.)
Azure上的完整来源和实时网站链接:https://github.com/johndpalm/IdentityUserPropertiesSample/tree/VS2013rtm
这是我在Startup.Auth.cs中的内容:
var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationoptions() { AppId = ConfigurationManager.AppSettings.Get("FacebookAppId"),AppSecret = ConfigurationManager.AppSettings.Get("FacebookAppSecret"),Provider = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationProvider() { OnAuthenticated = (context) => { const string XmlSchemaString = "http://www.w3.org/2001/XMLSchema#string"; foreach (var x in context.User) { var claimType = string.Format("urn:facebook:{0}",x.Key); string claimValue = x.Value.ToString(); if (!context.Identity.HasClaim(claimType,claimValue)) context.Identity.AddClaim(new System.Security.Claims.Claim(claimType,claimValue,XmlSchemaString,"Facebook")); } context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token",context.Accesstoken,"Facebook")); return Task.Fromresult(0); } } }; facebookOptions.Scope.Add("email"); app.UseFacebookAuthentication(facebookOptions);
捕获外部登录属性的另一种方法是为访问令牌添加一个声明,并使用属性填充它:
const string XmlSchemaString = "http://www.w3.org/2001/XMLSchema#string"; var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationoptions { AppId = ConfigurationManager.AppSettings.Get("FacebookAppId"),Provider = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationProvider() { OnAuthenticated = (context) => { var claim = new System.Security.Claims.Claim("urn:facebook:access_token","Facebook"); foreach (var x in context.User) { string key = string.Format("urn:facebook:{0}",x.Key); string value = x.Value.ToString(); claim.Properties.Add(key,value); } context.Identity.AddClaim(claim); return Task.Fromresult(0); } } };
注意 – 此示例不起作用:尽管通过属性传递单个声明是很好的.外部cookie似乎注意到声明属性.当从身份获取后,属性为空.
解决方法
这对我有用:
在Startup.ConfigureAuth(StartupAuth.cs)中创建一个新的(在此插入提供者名称)Authenticationoptions对象,传递客户端ID,客户机密码和新的AuthenticationProvider.您将使用一个lambda表达式来传递OnAuthenticated方法一些代码,以将Claim声明添加到包含从context.Identity中提取的值的标识中.
StartUp.Auth.cs
// Facebook : Create New App // https://dev.twitter.com/apps if (ConfigurationManager.AppSettings.Get("FacebookAppId").Length > 0) { var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationoptions() { AppId = ConfigurationManager.AppSettings.Get("FacebookAppId"),Provider = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationProvider() { OnAuthenticated = (context) => { context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token","Facebook")); foreach (var x in context.User) { var claimType = string.Format("urn:facebook:{0}",x.Key); string claimValue = x.Value.ToString(); if (!context.Identity.HasClaim(claimType,claimValue)) context.Identity.AddClaim(new System.Security.Claims.Claim(claimType,"Facebook")); } return Task.Fromresult(0); } } }; app.UseFacebookAuthentication(facebookOptions); }
注意:Facebook验证提供商使用这里使用的代码.如果您使用与Microsoft帐户提供程序相同的代码(或Foursquare provider我使用MS帐户代码作为模型创建),则无法登录.如果您只选择access_token参数,则可以正常工作.似乎有些参数打破了登录过程. (An issue has been opened on katanaproject.codeplex.com if progress on this is of interest to you.)如果我找到原因,我会更新我没有太多的Twitter或Google,除了验证我可以获得access_token.
var msaccountOptions = new Microsoft.Owin.Security.MicrosoftAccount.MicrosoftAccountAuthenticationoptions() { ClientId = ConfigurationManager.AppSettings.Get("MicrosoftClientId"),ClientSecret = ConfigurationManager.AppSettings.Get("MicrosoftClientSecret"),Provider = new Microsoft.Owin.Security.MicrosoftAccount.MicrosoftAccountAuthenticationProvider() { OnAuthenticated = (context) => { context.Identity.AddClaim(new System.Security.Claims.Claim("urn:microsoftaccount:access_token","Microsoft")); return Task.Fromresult(0); } } }; app.UseMicrosoftAccountAuthentication(msaccountOptions);
在AccountController中,我使用外部cookie从AuthenticationManager中提取ClaimsIdentity.然后将其添加到使用应用程序cookie创建的身份.我忽略了以“… schemas.xmlsoap.org/ws/2005/05/identity/claims”开头的任何声明,因为它似乎打破了登录.
AccountController.cs
private async Task SignInAsync(CustomUser user,bool isPersistent) { AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); var identity = await UserManager.CreateIdentityAsync(user,DefaultAuthenticationTypes.ApplicationCookie); // Extracted the part that has been changed in SignInAsync for clarity. await SetExternalProperties(identity); AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent },identity); } private async Task SetExternalProperties(ClaimsIdentity identity) { // get external claims captured in Startup.ConfigureAuth ClaimsIdentity ext = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie); if (ext != null) { var ignoreClaim = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims"; // add external claims to identity foreach (var c in ext.Claims) { if (!c.Type.StartsWith(ignoreClaim)) if (!identity.HasClaim(c.Type,c.Value)) identity.AddClaim(c); } } }
最后,我想显示任何不是从LOCAL AUTHORITY的值.我创建了一个部分视图_ExternalUserPropertiesListPartial,出现在/Account/Manage page.我得到我以前存储的AuthenticationManager.User.Claims的声明,然后将其传递给视图.
AccountController.cs
[ChildActionOnly] public ActionResult ExternalUserPropertiesList() { var extList = GetExternalProperties(); return (ActionResult)PartialView("_ExternalUserPropertiesListPartial",extList); } private List<ExtPropertyviewmodel> GetExternalProperties() { var claimlist = from claims in AuthenticationManager.User.Claims where claims.Issuer != "LOCAL AUTHORITY" select new ExtPropertyviewmodel { Issuer = claims.Issuer,Type = claims.Type,Value = claims.Value }; return claimlist.ToList<ExtPropertyviewmodel>(); }
只是为了彻底,看法:
_ExternalUserPropertiesListPartial.cshtml
@model IEnumerable<MySample.Models.ExtPropertyviewmodel> @if (Model != null) { <legend>External User Properties</legend> <table> <tbody> @foreach (var claim in Model) { <tr> <td>@claim.Issuer</td> <td>@claim.Type</td> <td>@claim.Value</td> </tr> } </tbody> </table> }
再次,工作示例和完整的代码在GitHub:https://github.com/johndpalm/IdentityUserPropertiesSample上
任何反馈,更正或改进将不胜感激.
关于asp.net-mvc – 实体框架种子与身份(Microsoft.Owin.Security)用户的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于asp.net – Microsoft MVC“echo / print / output”等、asp.net – System.Web.Security.AntiXss.AntiXssEncoder与Microsoft.Security.Application.AntiXssEncoder、asp.net – 不明确的引用问题(Microsoft.AspNet.Identity和Microsoft.AspNet.Identity.Core)、asp.net – 如何访问Microsoft.Owin.Security.xyz OnAuthenticated上下文AddClaims值?等相关内容,可以在本站寻找。
本文标签: