GVKun编程网logo

asp.net-mvc – 实体框架种子与身份(Microsoft.Owin.Security)用户

16

本文将带您了解关于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-mvc – 实体框架种子与身份(Microsoft.Owin.Security)用户

我有一个为数据库设置种子的类,它为2个用户添加了角色和自定义字段.我遇到的问题是它将数据保存在[dbo].[AspNetUsers]而不是[dbo].[IdentityUsers].两个表都已创建.播种时,数据进入AspNetUser.当我启动网站并注册新用户时,数据将进入IdentityUser.

这是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应用程序使用另一种时使用一种?

解决方法

您的DbContext是否继承自IdentityDbContext?

如果从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”等

asp.net – Microsoft MVC“echo / print / output”等

使用ASP.NET的视图引擎/模板aspx / ashx页面吐出到屏幕的方式似乎是:
<%= 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

asp.net – System.Web.Security.AntiXss.AntiXssEncoder与Microsoft.Security.Application.AntiXssEncoder

在ASP.NET 4.5中有一个新的命名空间System.Web.Security.Antixss,其中包含AntixssLibrary( http://www.asp.net/aspnet/overview/aspnet-45/whats-new#_Toc318097382)4.0版的编码例程.

最新版本的AntixssLibrary是4.2.1.

我非常困惑我在新项目中用于编码输出HTML的类型:内置System.Web.Security.Antixss.AntixssEncoder或来自AntixssLibrary的Microsoft.Security.Application.AntixssEncoder.有人会告诉我什么类型是首选使用,为什么?

解决方法

System.Web.*命名空间中的一个是Microsoft.Security.*命名空间中的一个克隆,但是System.Web稍微调整以获得更好的性能特征.我们建议您继续使用System.Web.

如果设置< 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)

asp.net – 不明确的引用问题(Microsoft.AspNet.Identity和Microsoft.AspNet.Identity.Core)

我正在使用最新的VS2015社区和ASP.NET 5等构建AngularJS单页面应用程序…

我在尝试实现身份验证时遇到的问题是我需要使用这两个命名空间:

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.Owin包是ASP.NET Identity 2的一部分,而不是ASP.NET 5附带的最新版本.尝试引用它将下载ASP.NET Identity 2并导致您遇到的奇怪错误.

只需引用Microsoft.AspNet.Identity即可.

asp.net – 如何访问Microsoft.Owin.Security.xyz OnAuthenticated上下文AddClaims值?

asp.net – 如何访问Microsoft.Owin.Security.xyz OnAuthenticated上下文AddClaims值?

我正在尝试检索作为OnAuthenticated上下文返回的用户属性,并作为声明添加以下示例: How to access Facebook private information by using ASP.NET Identity (OWIN)?

我可以看到我正在期待的数据正在登录时返回,并在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似乎注意到声明属性.当从身份获取后,属性为空.

解决方法

我可以创建一个工作示例,使用MVC 5 RTM模板,OWIN和ASP.NET身份位.您可以在这里找到完整的源代码和链接到现场工作示例: https://github.com/johndpalm/IdentityUserPropertiesSample

这对我有用:

在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值?等相关内容,可以在本站寻找。

本文标签: