现在我的服务在NT本地系统下运行。我想创建NTUser类型来运行服务。我不想创建本地系统帐户。在服务中,当你看到一些帐户运行在NT Service__下时。我还希望创建自定义NT服务CustomName用户来运行该服务。
所以,您的问题是创建帐户或在帐户下动态运行服务。如果是后者,请在c#中使用Impersonation。
我对你的问题感到困惑,让我猜一猜你可能想做什么:你试图使用内置的[NT AUTHORITYSYSTEM]帐户来授权你的应用程序使用其他服务。
这是我如何使用[NT AUTHORITYSYSTEM]帐户与我的c# MVC web应用程序来授权访问本地sql server数据库。
。净框架
// Views/Home/Index.cshtml
@ViewBag.Title="Home Page";
<div class="jumbotron">
<h1>Hello @Model</h1>
.....
// Controllers/HomeController.cs
using System.Data;
using System.Data.SqlClient;
using System.Web.Mvc;
public class HomeController : Controller
{
private string _connStr = @"
Database=MyDB;Integrated Security=true;";
public ActionResult Index()
{
using var conn = new SqlConnection(_connStr);
conn.Open();
var cmd = new SqlCommand(@"
SELECT TOP 1 [name] FROM [dbo].[person];", conn);
var reader = cmd.ExecuteReader();
if (reader.Read())
return View("index", reader["name"]);
else
throw new DataException("Nobody is in Person table!");
}
}
SQL IF NOT EXISTS(SELECT 1 FROM sys.syslogins WHERE name = 'NT AUTHORITYSYSTEM')
BEGIN
CREATE LOGIN [NT AUTHORITYSYSTEM]
FROM WINDOWS WITH DEFAULT_LANGUAGE = [us_english];
GRANT CONNECT TO [NT AUTHORITYSYSTEM];
END
IF NOT EXISTS(SELECT 1 FROM sys.sysusers WHERE name = 'NT AUTHORITYSYSTEM')
BEGIN
CREATE USER [NT AUTHORITYSYSTEM] FOR LOGIN [NT AUTHORITYSYSTEM];
ALTER ROLE [db_reader] ADD MEMBER [NT AUTHORITYSYSTEM];
END
IF NOT EXISTS(SELECT 1 FROM sys.tables WHERE name = 'person')
BEGIN
CREATE TABLE [dbo].[person] (
[id] UNIQUEIDENTIFIER CONSTRAINT [DF_dbo.person_id] DEFAULT (NEWID()) ROWGUIDCOL NOT NULL,
[name] NVARCHAR (50) NULL,
CONSTRAINT [PK_dbo.person] PRIMARY KEY CLUSTERED ([id] ASC)
);
INSERT INTO dbo.person
SELECT NEWID(), 'BILLY'
END
IIS 将Default App Pool
应用程序池更改为LocalSystem
身份,并将。net框架MVC应用程序发布到C:inetpubwwwroot
。
您现在有一个web应用程序在LocalSystem
身份(NT AUTHORITYSYSTEM
)下运行,并授予内置的NT AUTHORITYSYSTEM
用户访问权限来连接到您的数据库服务器。在SQL Server中,您已经为NT AUTHORITYSYSTEM
登录创建了一个NT AUTHORITYSYSTEM
用户。您还在dbo
模式上授予了SQL用户[db_reader]
。
为什么这很重要?
Integrated Security使用Kerberos认证实现从Windows服务器到Windows服务器的身份验证。在许多组织中,创建Active Directory用户是为了向IIS应用程序池提供身份,以便使用集成安全性访问数据库。
在这些AD帐户下运行Application Pool
允许对每个应用程序池有权访问的内容进行细粒度控制。此外,它还可以防止必须将密码合并到应用程序配置中。
本地开发时ACTIVE DIRECTORY身份用户方法的问题
使用AD Users作为身份的问题是,您需要访问Active Directory来模拟本地生产设置。您不应该有权访问模拟完全基于AD用户的身份验证所需的密码,而且您也不希望使用它,以防万一您意外地瞄准了生产数据库。更糟糕的是,您可能需要将整个开发域与生产域保持同等地位,以确保您可以访问所有必要的AD帐户。
内置验证是我们的"test double"用于Active Directory。使用NT AUTHORITYSYSTEM帐户,您可以快捷方式"完全使用活动目录",并将所有身份验证保持在本地。这是开发工作首先应该做的地方。
我喜欢更狭义地对待集成测试,一次测试一个集成点,用测试副本替换单独的服务和数据库。结合契约测试和针对测试副本运行契约测试以及实际实现,您可以提出更快,更独立并且通常更容易推理的集成测试。
- Martin Fowler: The Practical Test Pyramid
现在我们可以调试(以管理员身份运行Visual Studio),直接针对IIS,使用"test double"
标题>